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

Rufen Sie eine Set-Returning-Funktion mehrmals mit einem Array-Argument auf

In Postgres 9.3 oder höher ist es normalerweise am besten, LEFT JOIN LATERAL ... ON true zu verwenden :

SELECT sub.dataid, f.*
FROM  (
   SELECT dataid, array_agg(data) AS arr
   FROM   dataset
   WHERE  dataid = something
   GROUP  BY 1
   ) sub
LEFT   JOIN LATERAL foo(sub.arr) f ON true;

Wenn die Funktion foo() kann keine Zeilen zurückgeben , das ist die sichere Form, da sie alle Zeilen links vom Join beibehält, selbst wenn rechts keine Zeile zurückgegeben wird.

Sonst, oder wenn Sie wollen Um Zeilen ohne Ergebnis vom lateralen Join auszuschließen, verwenden Sie:

CROSS JOIN LATERAL foo(sub.arr)

oder die Abkürzung:

, foo(sub.arr)

Es gibt eine ausdrückliche Erwähnung im Handbuch.

Craigs verwandte Antwort (auf die von Daniel verwiesen wird) wird entsprechend aktualisiert:

  • Wie kann man mehrere Funktionsauswertungen mit der (func()).*-Syntax in einer SQL-Abfrage vermeiden?