Postgres में 9.3 या बाद में एक LATERAL
में शामिल होने का उपयोग करें?
पुराने संस्करणों के लिए, वहाँ पूरा करने के लिए क्या मुझे लगता है कि आप एक सेट लौटने समारोह (RETURNS TABLE
or RETURNS SETOF record
OR RETURNS record
) के साथ की कोशिश कर रहे एक बहुत ही सरल तरीका है:
SELECT *, (f_citizen_rec_modified(col1, col2)).*
FROM v_citizenversions v
फ़ंक्शन मानों की गणना करता है o बाहरी क्वेरी की हर पंक्ति के लिए एनसीई। यदि फ़ंक्शन एकाधिक पंक्तियां देता है, जिसके परिणामस्वरूप पंक्तियों को तदनुसार गुणा किया जाता है। पंक्तियों को विघटित करने के लिए सभी कोष्ठक को को वाक्य रचनात्मक रूप से आवश्यक है। तालिका समारोह कुछ इस तरह दिखाई दे सकता है:
CREATE OR REPLACE FUNCTION f_citizen_rec_modified(_col1 int, _col2 text)
RETURNS TABLE(col_c integer, col_d text) AS
$func$
SELECT s.col_c, s.col_d
FROM some_tbl s
WHERE s.col_a = $1
AND s.col_b = $2
$func$ LANGUAGE sql;
आप एक सबक्वेरी या CTE में इस रैप करने के लिए की जरूरत है अगर आप एक WHERE
खंड लागू करने के लिए, क्योंकि कॉलम एक ही स्तर पर दिखाई नहीं देते हैं चाहता हूँ। (और यह वैसे भी प्रदर्शन के लिए बेहतर है, क्योंकि आप समारोह के हर उत्पादन स्तंभ के लिए मूल्यांकन दोहराया रोकने):
SELECT col_a, col_b, (f_row).*
FROM (
SELECT col_a, col_b, f_citizen_rec_modified(col1, col2) AS f_row
FROM v_citizenversions v
) x
WHERE (f_row).col_c = _col_c;
इस या इसी तरह कुछ करने के लिए कई अन्य तरीके हैं। यह सब वास्तव में आप जो चाहते हैं उस पर निर्भर करता है।
स्रोत
2012-07-13 15:22:19
आप क्रॉस Postgres में लागू की जरूरत नहीं है। आप फ़ंक्शन की तरह एक टेबल फ़ंक्शन का उपयोग कर सकते हैं। बस उनसे जुड़ें। –
@a_horse_with_no_name - 'क्रॉस आवेदन 'टीवीएफ को एक बार निष्पादित करने के बजाय सहसंबंधित पैरामीटर के साथ फिर से निष्पादित करता है और फिर परिणाम में शामिल होता है। –