PostgreSQL-LATERAL 테이블 함수의 CAST 대 :: 연산자

Nov 27 2020

내가 할 수있는 동안

SELECT elem[1], elem[2]
FROM   ( VALUES ('1,2'::TEXT) ) AS q(arr),
       LATERAL CAST(String_To_Array(q.arr, ',') AS INT[]) AS elem
;

에 명시 적으로 호출을 사용하여 CAST, 나는 할 수 없습니다

SELECT elem[1], elem[2]
FROM   ( VALUES ('1,2'::TEXT) ) AS q(arr),
       LATERAL String_To_Array(q.arr, ',')::INT[] AS elem
;

암시 적 호출 ::연산자 사용 :

오류 : "::"또는 그 근처에 구문 오류가 있습니다.

명시 적이 CAST필요한 다른 위치 :

CREATE INDEX ON ... ( CAST(<straw> AS <gold>) );

나는 예를 들어 추가로 둘러싸는 괄호를 사용하는 것과 같은 구문상의 이유가 있는지 의심합니다. 이것은 여기에서 올바르지 않습니다.

이 시점에서 저수준 구현의 일부로 명시적인 함수 호출이 필요합니까? 아니면 언어 규칙을 따르나요?

답변

5 ErwinBrandstetter Nov 27 2020 at 11:35

훌륭한 코너 케이스 예. 이러한 구문 변형은 모두 "명시 적 유형 캐스트"이며 정확히 동일합니다. SQL 코드의 일부 특수 위치에서는 모호성을 피하기 위해 기능적 표기법 만 허용합니다.

두 번째 관찰에 관해서는 :

명시 적이 CAST필요한 다른 위치 :

CREATE INDEX ON ... ( CAST(<straw> AS <gold>) );

여기에서 속기 구문을 실제로 사용할 수 있습니다-모호하지 않게 만들기 위해 추가 괄호 세트를 사용합니다.

CREATE INDEX ON ... ((<straw>::<gold>));

db <> 여기에 바이올린

그리고 두 구문 변형은 쿼리의 다른 표현식과도 일치합니다. 보다:

  • JSONB 데이터 유형의 키 / 값에 대한 색인을 생성 할 수 있습니까?
  • Postgres에서 정수 JSON 속성에 대한 인덱스를 만드는 방법
  • 레스토랑 예약 스키마를 위해 Datetime을 2 개의 열로 분할?

(첫 번째 예제가 수행하는 작업을 수행하는 더 효율적인 방법이 있지만 그게 요점을 벗어났습니다.)

5 LaurenzAlbe Nov 27 2020 at 10:27

예, 약간 이상하지만 문법은 FROM 내 함수 표현식의 함수 호출과 구문 적으로 유사한 것을 받아들입니다.

따라서 FROM절 에서 임의의 표현을 원할 때 사용할 수있는 트릭 CAST입니다. 불필요한 표현으로 둘러싸십시오 .

PostgreSQL은 이러한 컨텍스트에서 함수처럼 보이는 모든 것을 테이블 함수로 기꺼이 처리합니다.