PostgreSQL - CAST vs :: operator en la función de tabla LATERAL
Mientras pueda
SELECT elem[1], elem[2]
FROM ( VALUES ('1,2'::TEXT) ) AS q(arr),
LATERAL CAST(String_To_Array(q.arr, ',') AS INT[]) AS elem
;
usando una llamada explícita a CAST
, no puedo
SELECT elem[1], elem[2]
FROM ( VALUES ('1,2'::TEXT) ) AS q(arr),
LATERAL String_To_Array(q.arr, ',')::INT[] AS elem
;
utilizando el ::
operador de llamada implícita :
ERROR: error de sintaxis en o cerca de "::"
Otra ubicación en la que CAST
se requiere un explícito :
CREATE INDEX ON ... ( CAST(<straw> AS <gold>) );
Dudo que haya una razón sintáctica, por ejemplo, usar paréntesis de cierre adicional, lo cual es incorrecto aquí.
¿Es la llamada de función explícita simplemente necesaria en este punto como parte de la implementación de bajo nivel? ¿O sigue alguna regla de idioma?
Respuestas
Excelentes ejemplos de casos de esquina. Ambas variantes de sintaxis son "conversiones de tipo explícitas", que hacen exactamente lo mismo. Da la casualidad de que algunas ubicaciones especiales en el código SQL solo permiten la notación funcional para evitar ambigüedades.
En cuanto a su segunda observación:
Otra ubicación en la que
CAST
se requiere un explícito :CREATE INDEX ON ... ( CAST(<straw> AS <gold>) );
La sintaxis abreviada se puede utilizar aquí, con un conjunto adicional de paréntesis para que sea inequívoca:
CREATE INDEX ON ... ((<straw>::<gold>));
db <> violín aquí
Y cualquiera de las variantes de sintaxis también coincide con la otra expresión en las consultas. Ver:
- ¿Podemos crear un índice para la clave / valor del tipo de datos JSONB?
- Cómo crear un índice en una propiedad json entera en postgres
- ¿Se divide la fecha y la hora en 2 columnas para el esquema de reserva del restaurante?
(Hay formas más eficientes de hacer lo que hace su primer ejemplo, pero probablemente eso no viene al caso).
Es un poco extraño, sí, pero la gramática solo aceptará algo sintácticamente similar a una llamada de función en una expresión de función en FROM.
Entonces, ese es un truco que puede usar si desea una expresión arbitraria en una FROM
cláusula: rodeela con una CAST
expresión innecesaria .
PostgreSQL tratará felizmente cualquier cosa que parezca una función como una función de tabla en tal contexto.