PostgreSQL mendukung pemanggilan fungsi pengembalian set di SELECT
ayat. Ini agak ditinggalkan sekarang karena kami memiliki LATERAL
dan tentu saja tidak disarankan karena memiliki perilaku yang agak tidak menentu, tetapi tetap berguna.
Dalam kasus Anda, Anda dapat menulis:
SELECT
i.*,
(partition_into_months(i.start_date, i.stop_or_current_date)).*
FROM invoicable_interval i;
Namun, ini dapat mengakibatkan satu panggilan ke partition_into_months
per kolom dikembalikan karena (fn).*
pada dasarnya diperluas secara makro menjadi (fn).col1, (fn).col2, ...
. Untuk menghindari hal ini, Anda dapat membungkusnya dalam subquery, mis.
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);
Perhatikan bahwa hasil aneh akan ditemukan dengan adanya beberapa set fungsi pengembalian di SELECT
daftar. Ini bukan cross-join seperti yang Anda harapkan. Misalnya, bandingkan:
SELECT generate_series(1,4), generate_series(1,4)
untuk
SELECT generate_series(1,4), generate_series(1,3);