Usando la función agregada personalizada array_agg_mult() como se define en esta respuesta relacionada:
Tu resultado esperado es imposible:
{{1},NULL,{abc}} Tendría que ser:
{{1},{NULL},{abc}}
Caso simple con 0 o 1 elementos de matriz
Para el caso simple de simplemente reemplazar la matriz vacía:puede lograrlo con:
WITH t(arr) AS (
VALUES
('{1}'::text[])
,('{}')
,('{abc}')
)
SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
FROM t;
Relleno dinámico para n elementos
Usando array_fill() para rellenar arreglos con elementos NULL hasta la longitud máxima:
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;
Todavía solo funciona para unidimensional matrices básicas.
Explicar
- Subconsulta
t1calcula la longitud máxima de la matriz unidimensional básica. COALESCE(array_length(arr, 1), 0)calcula la longitud de la matriz en esta fila.COALESCEpor defecto es0paraNULL.- Genera una matriz de relleno para la diferencia de longitud con
array_fill(). - Agregar eso a
arrcon|| - Agregue como arriba con
array_agg_mult().
SQL Fiddle.
demostrando todas .
La salida en SQL Fiddle es engañosa, por lo que transfiero el resultado al texto allí.