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

एक स्तर से अननेस्ट सरणी

व्याख्या करें

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[0]

. के समान लौटाता है
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[17]

जो शून्य है। मैं उस मामले पर दस्तावेज़ों को उद्धृत करता हूं:

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

डिफ़ॉल्ट रूप से, किसी सरणी के आयामों का निचला बाउंड इंडेक्स मान एक पर सेट किया जाता है।

0 यहाँ कोई विशेष अर्थ नहीं है। साथ ही, द्वि-आयामी सरणियों के साथ, आपको दो अनुक्रमणिका की आवश्यकता है आधार तत्व प्राप्त करने के लिए। इस तरह:

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1][2]

परिणाम:

2

आपके संदेश का पहला भाग थोड़ा अस्पष्ट है।

SELECT array_dims(ARRAY[[1,2,3], [4,5,6], [7,8,9]])

परिणाम:

[1:3][1:3]

वह दो है 3 तत्वों (1 से 3) प्रत्येक (9 मूल तत्व) के साथ आयाम।
यदि आप n-1 चाहते हैं आयाम तो यह एक सही परिणाम है:

SELECT ARRAY (SELECT unnest('{{1,2,3}, {4,5,6}, {7,8,9}}'::int[]))

परिणाम:

{1,2,3,4,5,6,7,8,9}

वह एक है आयाम। unnest() हमेशा प्रति पंक्ति एक आधार तत्व उत्पन्न करता है। मुझे यकीन नहीं है कि आप वास्तव में क्या परिणाम चाहते हैं। आपका उदाहरण सिर्फ एक और 2-आयामी सरणी है जिसमें घुंघराले कोष्ठक का एक लापता सेट है ...?

{1,2,3}, {4,5,6}, {7,8,9}

यदि आप सरणी का टुकड़ा चाहते हैं , इस संकेतन को आजमाएं:

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:2]

परिणाम:

{{1,2,3},{4,5,6}}

या यह:

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[2:2][1:2]

परिणाम:

{{4,5}}

समतल . करने के लिए परिणाम (1D सरणी प्राप्त करें):

  • 2d सरणी postgresql से 1d सरणी कैसे चुनें

यहां मैनुअल में और पढ़ें।

फ़ंक्शन

बाद में परीक्षण से पता चला कि यह plpgsql फ़ंक्शन बहुत है और तेज। पोस्टग्रेज 9.1 या बाद के संस्करण की आवश्यकता है:

CREATE OR REPLACE FUNCTION unnest_2d_1d(ANYARRAY, OUT a ANYARRAY)
  RETURNS SETOF ANYARRAY AS
$func$
BEGIN
   FOREACH a SLICE 1 IN ARRAY $1 LOOP
      RETURN NEXT;
   END LOOP;
END
$func$  LANGUAGE plpgsql IMMUTABLE;

देखें:

  • कैसे एक 2d सरणी को PostgreSQL में जल्दी से एक 1d सरणी में अननेस्ट करें?

लुकास द्वारा पोस्ट किए गए फ़ंक्शन का यह एक बेहतर और सरलीकृत संस्करण है:

CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray)
  RETURNS SETOF anyarray AS
$func$
SELECT array_agg($1[d1][d2])
FROM   generate_subscripts($1,1) d1
    ,  generate_subscripts($1,2) d2
GROUP  BY d1
ORDER  BY d1
$func$  LANGUAGE sql IMMUTABLE;

पोस्टग्रेज़ संस्करणों के लिए <8.4, array_agg() डिफ़ॉल्ट रूप से स्थापित नहीं है। इसे पहले बनाएं:

CREATE AGGREGATE array_agg(anyelement) (
 SFUNC=array_append,
 STYPE=anyarray,
 INITCOND='{}'
);

साथ ही, generate_subscripts() अभी पैदा नहीं हुआ है। इसके बजाय उपयोग करें:

...
FROM   generate_series(array_lower($1,1), array_upper($1,1)) d1
    ,  generate_series(array_lower($1,2), array_upper($1,2)) d2
...

कॉल करें:

SELECT unnest_2d_1d(ARRAY[[1,2], [3,4], [5,6]]);

परिणाम

{1,2}
{3,4}
{5,6}

एसक्यूएल फिडल.



  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 सुरक्षा का मानकीकरण

  2. क्या जेडीबीसी के साथ पोस्टग्रेज से कनेक्ट करते समय स्कीमा निर्दिष्ट करना संभव है?

  3. PostgreSQL में डेटा विभाजन के लिए एक गाइड

  4. PostgreSQL - तालिका नाम के रूप में गतिशील मान

  5. मैं कैसे PostgreSQL में छँटाई के साथ पंक्तियों की एक निश्चित संख्या को हटा सकता हूँ?