PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

SQL सर्वर में CROSS APPLY के अनुरूप पोस्टग्रेज करता है

पोस्टग्रेज में 9.3 या बाद में LATERAL . का उपयोग करें शामिल हों:

SELECT v.col_a, v.col_b, f.*  -- no parentheses here, f is a table alias
FROM   v_citizenversions v
LEFT   JOIN LATERAL f_citizen_rec_modified(v.col1, v.col2) f ON true
WHERE  f.col_c = _col_c;

क्यों LEFT JOIN LATERAL ... ON true ?

  • फ़ंक्शन से लौटाए गए रिकॉर्ड में कॉलम जुड़े हुए हैं

पुराने संस्करणों . के लिए , जो मुझे लगता है . को पूरा करने का एक बहुत ही आसान तरीका है आप एक सेट-रिटर्निंग फ़ंक्शन के साथ प्रयास कर रहे हैं (RETURNS TABLE या RETURNS SETOF record या RETURNS record ):

SELECT *, (f_citizen_rec_modified(col1, col2)).*
FROM   v_citizenversions v

फ़ंक्शन बाहरी क्वेरी की प्रत्येक पंक्ति के लिए एक बार मानों की गणना करता है। यदि फ़ंक्शन कई पंक्तियों को लौटाता है, तो परिणामी पंक्तियों को तदनुसार गुणा किया जाता है। सभी कोष्ठक वाक्यात्मक रूप से आवश्यक हैं एक पंक्ति प्रकार को विघटित करने के लिए। टेबल फ़ंक्शन कुछ इस तरह दिख सकता है:

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;

यदि आप WHERE लागू करना चाहते हैं, तो आपको इसे एक सबक्वेरी या CTE में लपेटना होगा खंड क्योंकि स्तंभ समान स्तर पर दिखाई नहीं दे रहे हैं। (और वैसे भी यह प्रदर्शन के लिए बेहतर है, क्योंकि आप फ़ंक्शन के प्रत्येक आउटपुट कॉलम के लिए बार-बार मूल्यांकन को रोकते हैं):

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;

ऐसा करने के और भी कई तरीके हैं या ऐसा ही कुछ। यह सब इस बात पर निर्भर करता है कि आप वास्तव में क्या चाहते हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL JSON कॉलम को JSONB में अपग्रेड करें?

  2. MySQLers के लिए PostgreSQL प्रशिक्षण

  3. एक ही समय में कैसे अद्यतन और चयन करें

  4. सीटीई और जन्मदिन विरोधाभास

  5. PostgreSQL क्रिएट एक्सटेंशन का उपयोग करके नए मॉड्यूल बनाना