PostgreSQL hỗ trợ gọi các hàm set-return trong SELECT
mệnh đề. Điều này có phần không được chấp nhận nữa vì chúng ta có LATERAL
và chắc chắn không được khuyến khích vì nó có hành vi khá thất thường, nhưng nó vẫn hữu ích.
Trong trường hợp của bạn, bạn có thể viết:
SELECT
i.*,
(partition_into_months(i.start_date, i.stop_or_current_date)).*
FROM invoicable_interval i;
Tuy nhiên, điều này có thể dẫn đến một cuộc gọi đến partition_into_months
mỗi cột được trả về vì (fn).*
về cơ bản được mở rộng macro thành (fn).col1, (fn).col2, ...
. Để tránh điều này, bạn có thể bọc nó trong một truy vấn con, ví dụ:
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);
Lưu ý rằng sẽ gặp phải các kết quả kỳ lạ khi có nhiều hàm trả về được đặt trong SELECT
danh sách. Nó không phải là một tham gia chéo như bạn mong đợi. Ví dụ:so sánh:
SELECT generate_series(1,4), generate_series(1,4)
đến
SELECT generate_series(1,4), generate_series(1,3);