PostgreSQL understøtter kaldende af sæt-returnerende funktioner i SELECT
klausul. Dette er noget forældet nu, hvor vi har LATERAL
og er bestemt afskrækket, fordi den har en ret uregelmæssig adfærd, men den forbliver nyttig.
I dit tilfælde kunne du skrive:
SELECT
i.*,
(partition_into_months(i.start_date, i.stop_or_current_date)).*
FROM invoicable_interval i;
Dette kan dog resultere i et kald til partition_into_months
kolonne returneret fordi (fn).*
er grundlæggende makroudvidet til (fn).col1, (fn).col2, ...
. For at undgå dette kan du pakke det ind i en underforespørgsel, f.eks.
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);
Bemærk, at mærkelige resultater vil blive stødt på, hvis der er flere sæt returnerende funktioner i SELECT
liste. Det er ikke en krydsforbindelse, som du ville forvente. Sammenlign f.eks.:
SELECT generate_series(1,4), generate_series(1,4)
til
SELECT generate_series(1,4), generate_series(1,3);