sql >> Databasteknik >  >> RDS >> PostgreSQL

Anropa en set-returnerande funktion med ett arrayargument flera gånger

I Postgres 9.3 eller senare är det vanligtvis bäst att använda 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;

Om funktionen foo() kan returnera inga rader , det är den säkra formen eftersom den bevarar alla rader till vänster om sammanfogningen, även när ingen rad återförs till höger.

Annars, eller om du vill för att utesluta rader utan resultat från den laterala sammanfogningen, använd:

CROSS JOIN LATERAL foo(sub.arr)

eller stenografin:

, foo(sub.arr)

Det finns ett uttryckligt omnämnande i manualen.

Craigs relaterade svar (refererad av Daniel) uppdateras därefter:

  • Hur undviker man flera funktionsevaler med syntaxen (func()).* i en SQL-fråga?


  1. Hur man listar databaser och tabeller i PostgreSQL

  2. Kan inte lösa sorteringskonflikt

  3. Oracle PL/SQL:Kontrollera om BLOB eller CLOB är tom

  4. Varför inga fönsterfunktioner i where-satser?