PostgreSQL obsługuje wywoływanie funkcji zwracających zestaw w SELECT
klauzula. Jest to nieco przestarzałe, ponieważ mamy LATERAL
i z pewnością jest odradzany, ponieważ zachowuje się raczej niekonsekwentnie, ale pozostaje użyteczny.
W twoim przypadku możesz napisać:
SELECT
i.*,
(partition_into_months(i.start_date, i.stop_or_current_date)).*
FROM invoicable_interval i;
Może to jednak spowodować jedno wywołanie partition_into_months
na kolumnę zwróconą, ponieważ (fn).*
jest w zasadzie rozwinięty w makro do (fn).col1, (fn).col2, ...
. Aby tego uniknąć, możesz umieścić go w podzapytaniu, np.
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);
Zauważ, że dziwne wyniki zostaną napotkane w obecności wielu funkcji zwracających zestaw w SELECT
lista. Nie jest to połączenie krzyżowe, jak można by się spodziewać. Na przykład porównaj:
SELECT generate_series(1,4), generate_series(1,4)
do
SELECT generate_series(1,4), generate_series(1,3);