Använder den anpassade aggregatfunktionen array_agg_mult()
som definieras i detta relaterade svar:
Ditt förväntade resultat är omöjligt:
{{1},NULL,{abc}}
Skulle behöva vara:
{{1},{NULL},{abc}}
Enkelt fall med 0 eller 1 arrayelement
För det enkla fallet att bara ersätta den tomma arrayen:Du kan uppnå 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 stoppning för n element
Använder array_fill()
att fylla ut arrayer med NULL-element upp till maximal längd:
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;
Fungerar fortfarande bara för 1-dimensionell grundläggande arrayer.
Förklara
- Underfråga
t1
beräknar den maximala längden för den grundläggande 1-dimensionella matrisen. COALESCE(array_length(arr, 1), 0)
beräknar längden på arrayen i den här raden.COALESCE
standard till0
förNULL
.- Generera utfyllnadsmatris för skillnaden i längd med
array_fill()
. - Lägg till det i
arr
med||
- Aggregera som ovan med
array_agg_mult()
.
SQL-fiol.
demonstrerar alla .
Utdata i SQL Fiddle är missvisande, så jag castar resultat till text där.