PostgreSQL stöder anrop av set-returing-funktioner i SELECT
klausul. Detta är något förlegat nu när vi har LATERAL
och är förvisso avskräckt eftersom den har ett ganska oregelbundet beteende, men det förblir användbart.
I ditt fall kan du skriva:
SELECT
i.*,
(partition_into_months(i.start_date, i.stop_or_current_date)).*
FROM invoicable_interval i;
Detta kan dock resultera i ett anrop till partition_into_months
per kolumn returneras eftersom (fn).*
är i princip makroexpanderat till (fn).col1, (fn).col2, ...
. För att undvika detta kan du slå in den i en underfråga, t.ex.
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);
Observera att konstiga resultat kommer att påträffas i närvaro av flera uppsättningsreturfunktioner i SELECT
lista. Det är inte en korskoppling som du förväntar dig. Jämför till exempel:
SELECT generate_series(1,4), generate_series(1,4)
till
SELECT generate_series(1,4), generate_series(1,3);