Usando a função de agregação personalizada
array_agg_mult()
como definido nesta resposta relacionada:Seu resultado esperado é impossível:
{{1},NULL,{abc}}
Teria de ser:
{{1},{NULL},{abc}}
Caso simples com 0 ou 1 elementos de matriz
Para o caso simples, basta substituir o array vazio:Você pode conseguir isso com:
WITH t(arr) AS (
VALUES
('{1}'::text[])
,('{}')
,('{abc}')
)
SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
FROM t;
Preenchimento dinâmico para n elementos
Usando
array_fill()
para preencher arrays com elementos NULL até o comprimento máximo: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;
Ainda funciona apenas para unidimensional matrizes básicas.
Explicar
- Subconsulta
t1
calcula o comprimento máximo da matriz unidimensional básica. COALESCE(array_length(arr, 1), 0)
calcula o comprimento da matriz nesta linha.COALESCE
o padrão é0
paraNULL
.- Gere uma matriz de preenchimento para a diferença de comprimento com
array_fill()
. - Anexar isso a
arr
com||
- Agregue como acima com
array_agg_mult()
.
SQL Fiddle. demonstrando todos .
A saída no SQL Fiddle é enganosa, então eu converto o resultado para o texto lá.