VARIADIC
जैसे @mu प्रदान किया गया, VARIADIC
आपका दोस्त है। एक और महत्वपूर्ण विवरण:
आप यह भी कर सकते हैं किसी फ़ंक्शन को VARIADIC
. का उपयोग करके कॉल करें एक सरणी प्रकार के साथ पैरामीटर सीधे। कुंजी शब्द जोड़ें VARIADIC
फ़ंक्शन कॉल में:
SELECT * FROM f_test(VARIADIC '{1, 2, 3}'::int[]);
के बराबर है:
SELECT * FROM f_test(1, 2, 3);
अन्य सलाह
Postgres 9.1 या बाद के संस्करण में right()
एक नकारात्मक . के साथ लंबाई एक स्ट्रिंग से प्रमुख वर्णों को ट्रिम करने के लिए तेज़ और आसान है:
right(j.status, -2)
के बराबर है:
substring(j.status, 3, char_length(jobs.status))
आपके पास j."DeleteFlag"
. है साथ ही j.DeleteFlag
(बिना दोहरे उद्धरण चिह्नों के) आपकी क्वेरी में। यह शायद गलत है। देखें:
- PostgreSQL त्रुटि:संबंध पहले से मौजूद है
"DeleteFlag" = '0'
एक और समस्या को इंगित करता है। अन्य RDBMS के विपरीत, Postgres ठीक से boolean
. का समर्थन करता है डेटा प्रकार। यदि ध्वज boolean
धारण करता है डेटा (true
/ false
/ NULL
) boolean
. का उपयोग करें प्रकार। एक वर्ण प्रकार जैसे text
अनुचित/अक्षम होगा।
उचित कार्य
आपको यहां पीएल/पीजीएसक्यूएल की आवश्यकता नहीं है। आप कर सकते हैं एक आसान SQL फ़ंक्शन का उपयोग करें:
CREATE OR REPLACE FUNCTION f_test(VARIADIC int[])
RETURNS TABLE (id int, reference int, job_title text, status text)
LANGUAGE sql AS
$func$
SELECT j.id, j.reference, j.job_title
, ltrim(right(j.status, -2)) AS status
FROM company c
JOIN job j USING (id)
WHERE c.active
AND NOT c.delete_flag
AND NOT j.delete_flag
AND (j.id = ANY($1) OR '{-1}'::int[] = $1)
ORDER BY j.job_title
$func$;
db<>फिडल यहाँ
पुराना sqlfiddle