PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wofür wird ein Zeilenkonstruktor verwendet?

Sie verwirren die Abstraktionsebenen. Wie andere Antworten bereits hervorheben, CREATE TYPE registriert nur einen (zusammengesetzten / Zeilen-) Typ im System. Während ein ROW Der Konstruktor gibt tatsächlich eine Zeile zurück.

Ein mit ROW erstellter Zeilentyp Der Konstruktor behält keine Spaltennamen bei, was deutlich wird, wenn Sie versuchen, die Zeile in JSON zu konvertieren.

Wenn Sie schon dabei sind, ROW ist nur ein Noise Word meistens. Die Dokumentation:

Demo:

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 hier
sqlfiddle

r1 und j1 ursprüngliche Spaltennamen beibehalten.
r2 und j2 nicht.
r3 und j3 sind gleich; um zu demonstrieren, wie ROW ist nur Rauschen.
r4 und j4 tragen die Spaltennamen des registrierten Typs.

Sie können die Zeile (Datensatz) in einen registrierten Zeilentyp umwandeln, wenn Zahl und Datentypen der Elemente entsprechen dem Zeilentyp - Namen der Eingabefelder werden ignoriert.