PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Appeler une fonction renvoyant un ensemble avec un argument de tableau plusieurs fois

Dans Postgres 9.3 ou version ultérieure, il est généralement préférable d'utiliser 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;

Si la fonction foo() peut renvoyer aucune ligne , c'est la forme sûre car elle préserve toutes les lignes à gauche de la jointure, même lorsqu'aucune ligne n'est renvoyée à droite.

Sinon, ou si vous voulez pour exclure les lignes sans résultat de la jointure latérale, utilisez :

CROSS JOIN LATERAL foo(sub.arr)

ou le raccourci :

, foo(sub.arr)

Il y a une mention explicite dans le manuel.

La réponse connexe de Craig (référencée par Daniel) est mise à jour en conséquence :

  • Comment éviter plusieurs évaluations de fonction avec la syntaxe (func()).* dans une requête SQL ?