Postgresql

PostgreSQL - LATERAL 表函式上的 CAST 與 :: 運算符

  • November 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>) );

我懷疑是否存在語法原因,例如使用額外的括號 - 這在這裡是不正確的。

此時是否需要顯式函式呼叫作為低級實現的一部分?或者它是否遵循任何語言規則?

優秀的極端案例範例。這兩種語法變體都是“顯式類型轉換”,完全相同。碰巧 SQL 程式碼中的某些特殊位置只允許使用函式式表示法來避免歧義。

至於你的第二個觀察:

另一個CAST需要顯式的位置:

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

實際上可以在這裡使用速記語法 - 使用一組額外的括號使其明確:

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

db<>在這裡擺弄

並且任一語法變體也匹配查詢中的另一個表達式。看:

(有更有效的方法來做你的第一個例子,但這可能不是重點。)

引用自:https://dba.stackexchange.com/questions/280410