PostgreSQL admite llamadas a funciones de devolución de conjuntos en SELECT
cláusula. Esto está algo obsoleto ahora que tenemos LATERAL
y ciertamente se desaconseja porque tiene un comportamiento bastante errático, pero sigue siendo útil.
En tu caso podrías escribir:
SELECT
i.*,
(partition_into_months(i.start_date, i.stop_or_current_date)).*
FROM invoicable_interval i;
Sin embargo, esto puede resultar en una llamada a partition_into_months
por columna devuelta porque (fn).*
es básicamente macro-expandido en (fn).col1, (fn).col2, ...
. Para evitar esto, puede envolverlo en una subconsulta, por ejemplo,
SELECT (x.i).*, (x.p).*
FROM
(
SELECT
i,
partition_into_months(i.start_date, i.stop_or_current_date) p
FROM invoicable_interval i
) x(i,p);
Tenga en cuenta que se encontrarán resultados extraños en presencia de múltiples funciones de devolución de conjuntos en el SELECT
lista. No es una combinación cruzada como cabría esperar. Por ejemplo, compare:
SELECT generate_series(1,4), generate_series(1,4)
a
SELECT generate_series(1,4), generate_series(1,3);