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
t1menghitung panjang maksimum larik 1 dimensi dasar. COALESCE(array_length(arr, 1), 0)menghitung panjang larik di baris ini.COALESCEdefault ke0untukNULL.- Buat larik pengisi untuk perbedaan panjang dengan
array_fill(). - Tambahkan itu ke
arrdengan|| - 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.