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);