Brug af den tilpassede aggregerede funktion array_agg_mult()
som defineret i dette relaterede svar:
Dit forventede resultat er umuligt:
{{1},NULL,{abc}}
Skulle være:
{{1},{NULL},{abc}}
Simpel case med 0 eller 1 array-elementer
For det simple tilfælde at erstatte det tomme array:Du kan opnå det med:
WITH t(arr) AS (
VALUES
('{1}'::text[])
,('{}')
,('{abc}')
)
SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
FROM t;
Dynamisk polstring til n elementer
Brug af array_fill()
at udfylde arrays med NULL-elementer op til den maksimale længde:
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;
Virker stadig kun til 1-dimensional grundlæggende arrays.
Forklar
- Underforespørgsel
t1
beregner den maksimale længde af det grundlæggende 1-dimensionelle array. COALESCE(array_length(arr, 1), 0)
beregner længden af arrayet i denne række.COALESCE
standard til0
forNULL
.- Generer padding-array for forskellen i længde med
array_fill()
. - Føj det til
arr
med||
- Aggregér som ovenfor med
array_agg_mult()
.
SQL Fiddle.
demonstrerer alle .
Output i SQL Fiddle er vildledende, så jeg caster resultatet til tekst der.