Použití vlastní agregační funkce array_agg_mult()
jak je definováno v této související odpovědi:
Váš očekávaný výsledek je nemožný:
{{1},NULL,{abc}}
Musí to být:
{{1},{NULL},{abc}}
Jednoduchý případ s 0 nebo 1 prvky pole
Pro jednoduchý případ stačí nahradit prázdné pole:Toho dosáhnete pomocí:
WITH t(arr) AS (
VALUES
('{1}'::text[])
,('{}')
,('{abc}')
)
SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
FROM t;
Dynamické odsazení pro n prvků
Pomocí array_fill()
k vyplnění polí prvky NULL až do maximální délky:
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;
Stále funguje pouze pro jednorozměrné základní pole.
Vysvětlete
- Poddotaz
t1
vypočítá maximální délku základního 1-rozměrného pole. COALESCE(array_length(arr, 1), 0)
vypočítá délku pole v tomto řádku.COALESCE
výchozí je0
proNULL
.- Vygenerujte pole výplně pro rozdíl v délce pomocí
array_fill()
. - Přidejte to do
arr
s||
- Agregujte jako výše pomocí
array_agg_mult()
.
SQL Fiddle.
předvedení všech .
Výstup v SQL Fiddle je zavádějící, takže jsem tam přenesl výsledek do textu.