Verwenden der benutzerdefinierten Aggregatfunktion array_agg_mult()
wie in dieser verwandten Antwort definiert:
Ihr erwartetes Ergebnis ist unmöglich:
{{1},NULL,{abc}}
Müsste lauten:
{{1},{NULL},{abc}}
Einfacher Fall mit 0 oder 1 Array-Element
Für den einfachen Fall, nur das leere Array zu ersetzen:Das erreichen Sie mit:
WITH t(arr) AS (
VALUES
('{1}'::text[])
,('{}')
,('{abc}')
)
SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
FROM t;
Dynamisches Padding für n Elemente
Verwenden von array_fill()
um Arrays mit NULL-Elementen bis zur maximalen Länge aufzufüllen:
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;
Funktioniert immer noch nur für 1-dimensional grundlegende Arrays.
Erklären
- Unterabfrage
t1
berechnet die maximale Länge des grundlegenden eindimensionalen Arrays. COALESCE(array_length(arr, 1), 0)
berechnet die Länge des Arrays in dieser Zeile.COALESCE
ist standardmäßig0
fürNULL
.- Auffüllarray für den Längenunterschied mit
array_fill()
erzeugen . - Hänge das an
arr
an mit||
- Aggregieren Sie wie oben mit
array_agg_mult()
.
SQL-Fiddle.
demonstrieren alle .
Die Ausgabe in SQL Fiddle ist irreführend, daher habe ich das Ergebnis dort in Text umgewandelt.