PostgreSQL podporuje volání funkcí vracejících sadu v SELECT doložka. Toto je nyní poněkud zastaralé, když máme LATERAL a rozhodně ho to odrazuje, protože se chová poněkud nevyzpytatelně, ale zůstává užitečné.
Ve vašem případě můžete napsat:
SELECT
i.*,
(partition_into_months(i.start_date, i.stop_or_current_date)).*
FROM invoicable_interval i;
To však může vést k jednomu volání partition_into_months za sloupec vrácený, protože (fn).* je v podstatě makro-rozšířený do (fn).col1, (fn).col2, ... . Chcete-li se tomu vyhnout, můžete jej zabalit do dílčího dotazu, např.
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);
Všimněte si, že v přítomnosti více set vracejících funkcí v SELECT dojde k podivným výsledkům seznam. Není to křížové spojení, jak byste očekávali. Porovnejte například:
SELECT generate_series(1,4), generate_series(1,4)
do
SELECT generate_series(1,4), generate_series(1,3);