sql >> Database >  >> RDS >> PostgreSQL

Roep een set-retourfunctie met een array-argument meerdere keren aan

In Postgres 9.3 of hoger is het meestal het beste om LEFT JOIN LATERAL ... ON true te gebruiken :

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;

Als de functie foo() kan geen rijen retourneren , dat is de veilige vorm omdat het alle rijen links van de join behoudt, zelfs als er geen rij naar rechts wordt teruggestuurd.

Anders, of als je wilt om rijen zonder resultaat uit te sluiten van de laterale verbinding, gebruik:

CROSS JOIN LATERAL foo(sub.arr)

of de steno:

, foo(sub.arr)

Er staat een expliciete vermelding in de handleiding.

Craig's gerelateerde antwoord (verwezen door Daniel) is dienovereenkomstig bijgewerkt:

  • Hoe vermijd je het evalueren van meerdere functies met de (func()).* syntaxis in een SQL-query?


  1. Een object laten STERVEN in SQL Server

  2. SQL rij-retourvolgorde

  3. Kan pg gem niet installeren op Mountain Lion

  4. Externe MySQL-verbinding inschakelen:ERROR 1045 (28000):Toegang geweigerd voor gebruiker