Korzystanie z niestandardowej funkcji agregującej array_agg_mult()
jak zdefiniowano w tej powiązanej odpowiedzi:
Twój oczekiwany wynik jest niemożliwy:
{{1},NULL,{abc}}
Musiałoby być:
{{1},{NULL},{abc}}
Prosty przypadek z 0 lub 1 elementami tablicy
W prostym przypadku wystarczy zastąpić pustą tablicę:Możesz to osiągnąć za pomocą:
WITH t(arr) AS (
VALUES
('{1}'::text[])
,('{}')
,('{abc}')
)
SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
FROM t;
Dynamiczne dopełnienie dla n elementów
Używanie array_fill()
aby wypełnić tablice elementami NULL do maksymalnej długości:
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;
Nadal działa tylko w przypadku jednowymiarowego podstawowe tablice.
Wyjaśnij
- Podzapytanie
t1
oblicza maksymalną długość podstawowej tablicy jednowymiarowej. COALESCE(array_length(arr, 1), 0)
oblicza długość tablicy w tym wierszu.COALESCE
domyślnie0
dlaNULL
.- Wygeneruj tablicę dopełniania dla różnicy długości za pomocą
array_fill()
. - Dołącz to do
arr
z||
- Agregacja jak powyżej za pomocą
array_agg_mult()
.
SQL Fiddle.
demonstrowanie wszystkich .
Wyjście w SQL Fiddle jest mylące, więc rzucam wynik na tekst.