Menggunakan fungsi agregat khusus array_agg_mult()
seperti yang didefinisikan dalam jawaban terkait ini:
Hasil yang Anda harapkan tidak mungkin:
{{1},NULL,{abc}}
Seharusnya:
{{1},{NULL},{abc}}
Kasus sederhana dengan 0 atau 1 elemen larik
Untuk kasus sederhana hanya mengganti array kosong:Anda dapat mencapainya dengan:
WITH t(arr) AS (
VALUES
('{1}'::text[])
,('{}')
,('{abc}')
)
SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
FROM t;
Padding dinamis untuk n elemen
Menggunakan array_fill()
untuk mengisi array dengan elemen NULL hingga panjang maksimum:
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;
Masih hanya berfungsi untuk 1-dimensi array dasar.
Jelaskan
- Subkueri
t1
menghitung panjang maksimum larik 1 dimensi dasar. COALESCE(array_length(arr, 1), 0)
menghitung panjang larik di baris ini.COALESCE
default ke0
untukNULL
.- Buat larik pengisi untuk perbedaan panjang dengan
array_fill()
. - Tambahkan itu ke
arr
dengan||
- Agregat seperti di atas dengan
array_agg_mult()
.
SQL Fiddle.
mendemonstrasikan semua .
Output dalam SQL Fiddle menyesatkan, jadi saya memberikan hasil ke teks di sana.