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

Reduzieren einer Beziehung mit einem Array, um eine Zeile pro Array-Eintrag auszugeben

Wir können die set-returning-Funktion unnest() in das SELECT Liste wie Raphaël vorschlägt . Dies führte vor Postgres 10 zu Eckfallproblemen. Siehe:

Seit Postgres 9.3 können wir auch einen verwenden LATERAL schließen Sie sich dafür an. Es ist die sauberere, standardkonforme Art, satzrückgebende Funktionen in FROM einzufügen Liste, nicht in die SELECT Liste:

SELECT name, value
FROM   tbl, unnest(values) value;  -- implicit CROSS JOIN LATERAL

Ein subtiler Unterschied:Dadurch werden Zeilen mit leeren / NULL values gelöscht aus dem Ergebnis seit unnest() gibt keine Zeile zurück , während dasselbe im FROM in einen NULL-Wert umgewandelt wird Liste und trotzdem zurückgegeben. Die zu 100 % äquivalente Abfrage lautet:

SELECT t.name, v.value
FROM   tbl t
LEFT   JOIN unnest(t.values) v(value) ON true;

Siehe: