कस्टम समग्र फ़ंक्शन का उपयोग करना array_agg_mult()
जैसे इस संबंधित उत्तर में परिभाषित किया गया है:
आपका अपेक्षित परिणाम असंभव है:
{{1},NULL,{abc}}
होना ही होगा:
{{1},{NULL},{abc}}
0 या 1 सरणी तत्वों वाला साधारण मामला
साधारण मामले के लिए केवल खाली सरणी को बदलने के लिए:आप इसे प्राप्त कर सकते हैं:
WITH t(arr) AS (
VALUES
('{1}'::text[])
,('{}')
,('{abc}')
)
SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
FROM t;
n तत्वों के लिए डायनामिक पैडिंग
array_fill()
Using का उपयोग करना अधिकतम लंबाई तक NULL तत्वों के साथ सरणियों को पैड करने के लिए:
SELECT array_agg_mult(ARRAY[
arr || array_fill(NULL::text
, ARRAY[max_elem - COALESCE(array_length(arr, 1), 0)])
]) AS result
FROM t, (SELECT max(array_length(arr, 1)) AS max_elem FROM t) t1;
अभी भी केवल 1-आयामी . के लिए काम करता है बुनियादी सरणियाँ।
व्याख्या करें
- सबक्वायरी
t1
बुनियादी 1-आयामी सरणी की अधिकतम लंबाई की गणना करता है। COALESCE(array_length(arr, 1), 0)
इस पंक्ति में सरणी की लंबाई की गणना करता है।COALESCE
0
. पर डिफ़ॉल्टNULL
. के लिए ।- लंबाई में अंतर के लिए
array_fill()
. के साथ पैडिंग ऐरे जेनरेट करें । - उसे
arr
में जोड़ें||
. के साथ - उपरोक्त की तरह
array_agg_mult()
. के साथ एकत्र करें ।
SQL Fiddle.
प्रदर्शन सभी .
एसक्यूएल फिडल में आउटपुट भ्रामक है, इसलिए मैंने वहां टेक्स्ट के लिए परिणाम डाला।