व्याख्या करें
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}
एसक्यूएल फिडल.