sql >> Base de Datos >  >> RDS >> PostgreSQL

Llame a una función de devolución de conjuntos con un argumento de matriz varias veces

En Postgres 9.3 o posterior, normalmente es mejor 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;

Si la función foo() puede devolver sin filas , esa es la forma segura ya que conserva todas las filas a la izquierda de la combinación, incluso cuando no se devuelve ninguna fila a la derecha.

Si no, o si quieres para excluir filas sin resultado de la unión lateral, use:

CROSS JOIN LATERAL foo(sub.arr)

o la abreviatura:

, foo(sub.arr)

Hay una mención explícita en el manual.

La respuesta relacionada de Craig (a la que hace referencia Daniel) se actualiza en consecuencia:

  • ¿Cómo evitar múltiples evaluaciones de funciones con la sintaxis (func()).* en una consulta SQL?