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);