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

Kald en sæt-returnerende funktion med et array-argument flere gange

I Postgres 9.3 eller nyere er det typisk bedst at bruge 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;

Hvis funktionen foo() kan returnere ingen rækker , det er den sikre form, da den bevarer alle rækker til venstre for sammenføjningen, selv når ingen række vender tilbage til højre.

Ellers, eller hvis du vil for at udelukke rækker uden resultat fra sidesammenføjningen, brug:

CROSS JOIN LATERAL foo(sub.arr)

eller stenografien:

, foo(sub.arr)

Der er en eksplicit omtale i manualen.

Craigs relaterede svar (refereret af Daniel) er opdateret i overensstemmelse hermed:

  • Hvordan undgår man flere funktionsevaler med (func()).*-syntaksen i en SQL-forespørgsel?


  1. Hvordan kan jeg slette ved hjælp af INNER JOIN med SQL Server?

  2. Hvordan installeres SQLcl på Windows?

  3. Alt du behøver at vide om SQL CTE på ét sted

  4. 11 funktioner til at få dagen, måneden og året fra en dato i MariaDB