PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

A quoi sert un constructeur de ligne ?

Vous confondez les niveaux d'abstraction. Comme d'autres réponses le soulignent déjà, CREATE TYPE enregistre uniquement un type (composite / ligne) dans le système. Alors qu'un ROW constructeur renvoie en fait une ligne.

Un type de ligne créé avec le ROW constructeur ne conserve pas les noms de colonne, ce qui devient évident lorsque vous essayez de convertir la ligne en JSON.

Pendant que vous y êtes, ROW n'est qu'un mot bruyant le plus souvent. La documentation :

Démo :

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<>violon ici
sqlfiddle

r1 et j1 conserver les noms de colonne d'origine.
r2 et j2 ne le faites pas.
r3 et j3 sont identiques; pour montrer comment ROW n'est que du bruit.
r4 et j4 portent les noms de colonne du type enregistré.

Vous pouvez convertir la ligne (enregistrement) en un type de ligne enregistré si nombre et types de données des éléments correspondent au type de ligne - noms des champs de saisie sont ignorés.