PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Chame uma função de retorno de conjunto com um argumento de matriz várias vezes


No Postgres 9.3 ou posterior, normalmente é melhor usar 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 a função foo() pode retornar nenhuma linha , essa é a forma segura, pois preserva todas as linhas à esquerda da junção, mesmo quando nenhuma linha é retornada à direita.

Caso contrário, ou se querer para excluir linhas sem resultado da junção lateral, use:
CROSS JOIN LATERAL foo(sub.arr)

ou abreviação:
, foo(sub.arr)

Há uma menção explícita no manual.

A resposta relacionada de Craig (referenciada por Daniel) é atualizada de acordo:
  • Como evitar várias avaliações de função com a sintaxe (func()).* em uma consulta SQL?