PostgreSQL ondersteunt het aanroepen van set-returning-functies in de SELECT
clausule. Dit is enigszins verouderd nu we LATERAL
. hebben en wordt zeker ontmoedigd omdat het nogal grillig gedrag vertoont, maar het blijft nuttig.
In jouw geval zou je kunnen schrijven:
SELECT
i.*,
(partition_into_months(i.start_date, i.stop_or_current_date)).*
FROM invoicable_interval i;
Dit kan echter resulteren in één aanroep naar partition_into_months
per kolom geretourneerd omdat (fn).*
is in principe macro-uitgebreid tot (fn).col1, (fn).col2, ...
. Om dit te voorkomen, kunt u het in een subquery plaatsen, bijvoorbeeld
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);
Merk op dat er vreemde resultaten zullen worden gevonden in de aanwezigheid van meerdere set terugkerende functies in de SELECT
lijst. Het is geen cross-join zoals je zou verwachten. Vergelijk bijvoorbeeld:
SELECT generate_series(1,4), generate_series(1,4)
naar
SELECT generate_series(1,4), generate_series(1,3);