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

क्या PostgreSQL में ज़िप () फ़ंक्शन जैसा कुछ है जो दो सरणियों को जोड़ता है?

9.5 या बाद के संस्करण पोस्ट करें

है array_agg(array expression) :

<ब्लॉकक्वॉट>

array_agg ( anyarray ) → anyarray

सभी इनपुट सरणी को एक उच्च आयाम की सरणी में जोड़ता है। (इनपुट में सभी समान आयाम होने चाहिए, और खाली या शून्य नहीं हो सकते।)

यह मेरे कस्टम एग्रीगेट फ़ंक्शन array_agg_mult() . के लिए ड्रॉप-इन प्रतिस्थापन है नीचे दिखाया गया है। यह सी में लागू किया गया है और काफी तेज है। इसका इस्तेमाल करें।

9.4 पोस्ट करें

ROWS FROM का उपयोग करें निर्माण या अपडेट किया गया unnest() जो समानांतर में कई सरणियों को अनस्ट करने के लिए लेता है। प्रत्येक की एक अलग लंबाई हो सकती है। आपको (प्रति दस्तावेज़) मिलता है:

<ब्लॉकक्वॉट>

[...] इस मामले में परिणाम पंक्तियों की संख्या सबसे बड़े फ़ंक्शन परिणाम की है, जिसमें छोटे परिणाम मिलान करने के लिए शून्य मानों के साथ गद्देदार होते हैं।

इस क्लीनर और सरल संस्करण का उपयोग करें:

SELECT ARRAY[a,b] AS ab
FROM   unnest('{a,b,c}'::text[] 
            , '{d,e,f}'::text[]) x(a,b);

9.3 या पुराने को पोस्ट करें

साधारण ज़िप ()

Postgres 9.3 या इससे पहले . के लिए निम्न डेमो पर विचार करें :

SELECT ARRAY[a,b] AS ab
FROM  (
   SELECT unnest('{a,b,c}'::text[]) AS a
        , unnest('{d,e,f}'::text[]) AS b
    ) x;

परिणाम:

  ab
-------
 {a,d}
 {b,e}
 {c,f}

ध्यान दें कि दोनों सरणियों में तत्वों की समान संख्या . होनी चाहिए समानांतर में अननेस्ट करने के लिए, या आपको इसके बजाय एक क्रॉस जॉइन मिलता है।

आप इसे एक फ़ंक्शन में लपेट सकते हैं, यदि आप चाहते हैं:

CREATE OR REPLACE FUNCTION zip(anyarray, anyarray)
  RETURNS SETOF anyarray LANGUAGE SQL AS
$func$
SELECT ARRAY[a,b] FROM (SELECT unnest($1) AS a, unnest($2) AS b) x;
$func$;

कॉल करें:

SELECT zip('{a,b,c}'::text[],'{d,e,f}'::text[]);

वही परिणाम।

zip() से बहु-आयामी सरणी:

अब, यदि आप एकत्र करना . करना चाहते हैं सरणियों का वह नया सेट एक 2-आयामी . में सरणी, यह और अधिक जटिल हो जाती है।

SELECT ARRAY (SELECT ...)

या:

SELECT array_agg(ARRAY[a,b]) AS ab
FROM  (
   SELECT unnest('{a,b,c}'::text[]) AS a
         ,unnest('{d,e,f}'::text[]) AS b
    ) x

या:

SELECT array_agg(ARRAY[ARRAY[a,b]]) AS ab
FROM  ...

सभी एक ही त्रुटि संदेश में परिणाम देंगे (पृष्ठ 9.1.5 के साथ परीक्षण):

<ब्लॉकक्वॉट>

त्रुटि:डेटा प्रकार टेक्स्ट के लिए सरणी प्रकार नहीं खोजा जा सका []

लेकिन इसके इर्द-गिर्द एक रास्ता है, जैसा कि हमने इस निकट से संबंधित प्रश्न के तहत काम किया है।
एक कस्टम समग्र फ़ंक्शन बनाएं:

CREATE AGGREGATE array_agg_mult (anyarray) (
   SFUNC    = array_cat
 , STYPE    = anyarray
 , INITCOND = '{}'
);

और इसे इस तरह इस्तेमाल करें:

SELECT array_agg_mult(ARRAY[ARRAY[a,b]]) AS ab
FROM  (
   SELECT unnest('{a,b,c}'::text[]) AS a
        , unnest('{d,e,f}'::text[]) AS b
    ) x

परिणाम:

{{a,d},{b,e},{c,f}}

अतिरिक्त ARRAY[] पर ध्यान दें परत! इसके बिना और सिर्फ:

SELECT array_agg_mult(ARRAY[a,b]) AS ab
FROM ...

आपको मिलता है:

{a,d,b,e,c,f}

जो अन्य उद्देश्यों के लिए उपयोगी हो सकता है।

एक और फ़ंक्शन रोल करें:

CREATE OR REPLACE FUNCTION zip2(anyarray, anyarray)
  RETURNS SETOF anyarray LANGUAGE SQL AS
$func$
SELECT array_agg_mult(ARRAY[ARRAY[a,b]])
FROM (SELECT unnest($1) AS a, unnest($2) AS b) x;
$func$;

कॉल करें:

SELECT zip2('{a,b,c}'::text[],'{d,e,f}'::text[]); -- or any other array type

परिणाम:

{{a,d},{b,e},{c,f}}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टग्रेज सर्वर नोडज अनुरोध का जवाब नहीं दे रहा है

  2. ओपनप्रोजेक्ट के लिए डेटा खोए बिना पोस्टग्रेस्क्ल डेटाबेस को 10 से 12 तक अपग्रेड कैसे करें

  3. एक तालिका के SQL अद्यतन फ़ील्ड दूसरे के फ़ील्ड से

  4. PostgreSQL में ग्रेटेस्ट () फ़ंक्शन

  5. क्या मैं Postgresql को लेन-देन में त्रुटियों को अनदेखा करने के लिए कह सकता हूँ?