sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Para qué se utiliza un constructor de filas?

Estás confundiendo los niveles de abstracción. Como ya señalan otras respuestas, CREATE TYPE solo registra un tipo (compuesto/fila) en el sistema. Mientras que una ROW constructor en realidad devuelve una fila.

Un tipo de fila creado con ROW El constructor no conserva los nombres de las columnas, lo que se vuelve evidente cuando intenta convertir la fila a JSON.

Mientras estás en eso, ROW es solo una palabra de ruido la mayor parte del tiempo La documentación:

Demostración:

SELECT t                              AS r1, row_to_json(t)                           AS j1
     , ROW(1, 'x', NUMERIC '42.1')    AS r2, row_to_json(ROW(1, 'x', NUMERIC '42.1')) AS j2
     ,    (1, 'x', NUMERIC '42.1')    AS r3, row_to_json(   (1, 'x', NUMERIC '42.1')) AS j3
     ,    (1, 'x', '42.1')::myrowtype AS r4, row_to_json((1, 'x', '42.1')::myrowtype) AS j4
FROM (SELECT 1, 'x', NUMERIC '42.1') t;

db<>fiddle aquí
sqlfiddle

r1 y j1 conservar los nombres de las columnas originales.
r2 y j2 no.
r3 y j3 son lo mismo; para demostrar cómo ROW es solo ruido.
r4 y j4 llevan los nombres de columna del tipo registrado.

Puede convertir la fila (registro) en un tipo de fila registrado si número y tipos de datos de los elementos coinciden con el tipo de fila - nombres de los campos de entrada se ignoran.