PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Chiama più volte una funzione di restituzione di set con un argomento di matrice

In Postgres 9.3 o versioni successive, in genere è meglio utilizzare LEFT JOIN LATERAL ... ON true :

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;

Se la funzione foo() può restituire nessuna riga , questo è il modulo sicuro in quanto conserva tutte le righe a sinistra del join, anche quando nessuna riga viene restituita a destra.

Altrimenti, o se vuoi per escludere righe senza risultato dall'unione laterale, utilizzare:

CROSS JOIN LATERAL foo(sub.arr)

o la stenografia:

, foo(sub.arr)

C'è una menzione esplicita nel manuale.

La risposta correlata di Craig (a cui fa riferimento Daniel) viene aggiornata di conseguenza:

  • Come evitare più valutazioni di funzioni con la sintassi (func()).* in una query SQL?