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
t1vypočí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.COALESCEvýchozí je0proNULL.- Vygenerujte pole výplně pro rozdíl v délce pomocí
array_fill(). - Přidejte to do
arrs|| - 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.