虽然我可以
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>) );
我怀疑是否存在语法原因,例如使用额外的括号 - 这在这里是不正确的。
此时是否需要显式函数调用作为低级实现的一部分?或者它是否遵循任何语言规则?
是的,这有点奇怪,但是语法只接受语法上类似于 function-in-FROM 表达式中的函数调用的东西。
因此,如果您想在子句中使用任意表达式,这确实是您可以使用的技巧
FROM
:用不必要的CAST
表达式将其包围。在这种情况下,PostgreSQL 很乐意将任何看起来像函数的东西视为表函数。
优秀的极端案例示例。这两种语法变体都是“显式类型转换”,完全相同。碰巧 SQL 代码中的某些特殊位置只允许使用函数式表示法来避免歧义。
至于你的第二个观察:
实际上可以在这里使用速记语法 - 使用一组额外的括号使其明确:
db<>在这里摆弄
并且任一语法变体也匹配查询中的另一个表达式。看:
(有更有效的方法来做你的第一个例子,但这可能不是重点。)