यह काम करता है:
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 के साथ ऑप्टिमाइज़ करना