PostgreSQL करता है सरणी सबस्क्रिप्ट उत्पन्न करने के लिए समर्पित कार्य प्रदान करें:
WITH x(a) AS ( VALUES ('{1,20,3,5}'::int[]) )
SELECT generate_subscripts(a, 1) AS idx
,unnest(a) AS val
FROM x;
प्रभावी रूप से यह लगभग @ फ्रैंक की क्वेरी के समान ही है, बिना सबक्वेरी के।
साथ ही यह उन सबस्क्रिप्ट के साथ काम करता है जो 1
से शुरू नहीं होते हैं। ।
कोई भी समाधान 1-आयामी . के लिए काम करता है केवल सरणी! (आसानी से कई आयामों में विस्तारित किया जा सकता है।)
समारोह:
CREATE OR REPLACE FUNCTION unnest_with_idx(anyarray)
RETURNS TABLE(idx integer, val anyelement) LANGUAGE SQL IMMUTABLE AS
$func$
SELECT generate_subscripts($1, 1), unnest($1);
$func$;
कॉल करें:
SELECT * FROM unnest_with_idx('{1,20,3,5}'::int[]);
इस पर भी विचार करें:
SELECT * FROM unnest_with_idx('[4:7]={1,20,3,5}'::int[]);
इस संबंधित प्रश्न में सरणी सबस्क्रिप्ट के बारे में अधिक जानकारी।
यदि आप वास्तव में सामान्यीकृत सबस्क्रिप्ट चाहते हैं (1 से शुरू), मैं इसका उपयोग करूंगा:
SELECT generate_series(1, array_length($1,1)) ...
array_length()
. के साथ, लगभग यही क्वेरी आपके पास पहले से थी array_upper()
. के बजाय - जो गैर-मानक सबस्क्रिप्ट के साथ विफल हो जाएगा।
प्रदर्शन
मैंने अब तक यहां प्रस्तुत सभी प्रश्नों के साथ 1000 int की एक सरणी पर एक त्वरित परीक्षण चलाया। row_number()
. को छोड़कर वे सभी लगभग एक जैसा (~ 3,5 ms) प्रदर्शन करते हैं सबक्वेरी पर (~ 7,5 एमएस) - जैसा कि अपेक्षित था, सबक्वेरी के कारण।
अपडेट:9.4+ पोस्टग्रेट करता है
जब तक आप गैर-मानक इंडेक्स सबस्क्रिप्ट के साथ काम नहीं करते, तब तक नए WITH ORDINALITY
का उपयोग करें इसके बजाय:
- तत्व संख्या के साथ PostgreSQL unnest()