sql >> Databáze >  >> RDS >> PostgreSQL

K čemu se používá konstruktor řádků?

Pletete si úrovně abstrakce. Jak již zdůrazňují jiné odpovědi, CREATE TYPE registruje v systému pouze typ (složený / řádek). Zatímco ROW konstruktor ve skutečnosti vrací řádek.

Typ řádku vytvořený pomocí ROW konstruktor nezachovává názvy sloupců, což se projeví, když se pokusíte převést řádek na JSON.

Během toho ROW je jen hlučné slovo většinu času. Dokumentace:

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

r1 a j1 zachovat původní názvy sloupců.
r2 a j2 ne.
r3 a j3 jsou stejní; ukázat, jak ROW je jen šum.
r4 a j4 nesou názvy sloupců registrovaného typu.

Řádek (záznam) můžete přetypovat na registrovaný typ řádku, pokud číslo a datové typy prvků odpovídá typu řádku - názvy vstupních polí jsou ignorována.



  1. Vložení seznamu obsahujícího více hodnot do MySQL pomocí pymysql

  2. ORA-00119:neplatná specifikace ORA-00132:chyba syntaxe

  3. ServiceStack:Testování OrmLite, nainstalovaného s NuGet, ale dostávám chybu FileNotFoundException

  4. Na co se v tomto SQL nevztahuje?