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

plpgsql फ़ंक्शन में इनपुट सरणी के तत्वों से मेल खाने वाली पंक्तियाँ लौटाएँ

यह काम करता है:

CREATE OR REPLACE FUNCTION avg_purchases(last_names text[] = '{}')
  RETURNS TABLE(last_name text, avg_purchase_size float8) AS
$func$
   SELECT last_name, AVG(purchase_size)::float8
   FROM   purchases
   WHERE  last_name = ANY($1)
   GROUP  BY last_name
$func$  LANGUAGE sql;

कॉल करें:

SELECT * FROM avg_purchases('{foo,Bar,baz,"}weird_name''$$"}');

या (अपडेट - उदाहरण डॉलर-उद्धरण के साथ):

SELECT * FROM avg_purchases($x${foo,Bar,baz,"}weird_name'$$"}$x$);
  • स्ट्रिंग लिटरल को कोट करने के तरीके के बारे में अधिक जानकारी:
    PostgreSQL में सिंगल कोट्स के साथ टेक्स्ट डालें

  • आपको यहां गतिशील SQL की आवश्यकता नहीं है।

  • जबकि आप कर सकते हैं इसे एक plpgsql फ़ंक्शन (जो उपयोगी हो सकता है) में लपेटें, एक साधारण SQL फ़ंक्शन ठीक काम कर रहा है।

  • आपके पास बेमेल टाइप करें

    • avg() का परिणाम numericहो सकता है एक सटीक परिणाम रखने के लिए। मैंने float8 . पर डाला इसे काम करने के लिए, जो कि double precision के लिए सिर्फ एक उपनाम है (आप या तो उपयोग कर सकते हैं)। यदि आपको सटीक सटीकता की आवश्यकता है, तो numeric का उपयोग करें इसके बजाय।
    • चूंकि आपने GROUP BY last_name आप एक सादा text चाहते हैं text[] . के बजाय OUT पैरामीटर ।

VARIADIC

एक सरणी एक उपयोगी प्रकार का इनपुट है। यदि आपके क्लाइंट के लिए यह आसान है तो आप VARIADIC . का भी उपयोग कर सकते हैं इनपुट पैरामीटर जो सरणी को तत्वों की सूची . के रूप में पास करने की अनुमति देता है :

CREATE OR REPLACE FUNCTION avg_purchases(VARIADIC last_names text[] = '{}')
  RETURNS TABLE(last_name text, avg_purchase_size float8) AS
$func$
   SELECT last_name, AVG(purchase_size)::float8
   FROM   purchases
   JOIN  (SELECT unnest($1)) t(last_name) USING (last_name)
   GROUP  BY last_name
$func$  LANGUAGE sql;

कॉल करें:

SELECT * FROM avg_purchases('foo', 'Bar', 'baz', '"}weird_name''$$"}');

या (डॉलर-उद्धरण के साथ):

SELECT * FROM avg_purchases('foo', 'Bar', 'baz', $y$'"}weird_name'$$"}$y$);

ध्यान रखें कि मानक पोस्टग्रेज केवल अधिकतम 100 तत्वों . की अनुमति देता है . यह संकलन समय पर प्रीसेट विकल्प द्वारा निर्धारित किया जाता है:

<ब्लॉककोट>

max_function_args (integer)

फ़ंक्शन तर्कों की अधिकतम संख्या की रिपोर्ट करता है। यह FUNC_MAX_ARGS . के मान से निर्धारित होता है सर्वर बनाते समय। डिफ़ॉल्ट मान 100 तर्क है।

कीवर्ड VARIADIC . के साथ प्रीफ़िक्स किए जाने पर भी आप इसे ऐरे नोटेशन के साथ कॉल कर सकते हैं :

SELECT * FROM avg_purchases(VARIADIC '{1,2,3, ... 99,100,101}');

बड़े सरणियों (100+) के लिए, मैं unnest() . का भी उपयोग करूंगा एक सबक्वेरी में और JOIN इसके लिए, जो बेहतर पैमाने पर होता है:

  • पोस्टग्रेज क्वेरी को बड़े IN के साथ ऑप्टिमाइज़ करना



  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 में क्वेरी ऑप्टिमाइज़ेशन। मूल बातें समझाएं - भाग 2

  2. रेल और पोस्टग्रेएसक्यूएल:भूमिका पोस्टग्रेज मौजूद नहीं है

  3. PostgreSQL में Oracle उच्च उपलब्धता अवधारणाएं

  4. सभी स्कीमा में PostgreSQL एक्सटेंशन स्थापित करना

  5. Sysbench का उपयोग करके PostgreSQL के प्रदर्शन को बेंचमार्क कैसे करें