PostgreSQL поддържа извикване на функции за връщане на набор в SELECT
клауза. Това донякъде е остаряло сега, когато имаме LATERAL
и със сигурност се обезсърчава, защото има доста непостоянно поведение, но остава полезен.
Във вашия случай можете да напишете:
SELECT
i.*,
(partition_into_months(i.start_date, i.stop_or_current_date)).*
FROM invoicable_interval i;
Това обаче може да доведе до едно извикване на partition_into_months
за колона, върната, защото (fn).*
е основно макро-разширено в (fn).col1, (fn).col2, ...
. За да избегнете това, можете да го обвиете в подзаявка, напр.
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);
Обърнете внимание, че ще се появят странни резултати при наличието на множество връщащи функции в SELECT
списък. Това не е кръстосано свързване, както бихте очаквали. Например сравнете:
SELECT generate_series(1,4), generate_series(1,4)
до
SELECT generate_series(1,4), generate_series(1,3);