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

PostgreSQL के साथ सरणी आंतरिक अनुक्रमणिका का उपयोग कैसे करें?

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()


  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 में Oracle उच्च उपलब्धता अवधारणाएं

  2. PostgreSQL में किसी अन्य तालिका के कॉलम के साथ तालिका के कॉलम को अपडेट करें

  3. PostgreSQL की कार्यक्षमता का विस्तार करने के दस तरीके

  4. एसक्यूएल चयन गति int बनाम varchar

  5. पोस्टग्रेज सर्वर नोडज अनुरोध का जवाब नहीं दे रहा है