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