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
t1
calcula 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.COALESCE
por defecto es0
paraNULL
.- Genera una matriz de relleno para la diferencia de longitud con
array_fill()
. - Agregar eso a
arr
con||
- 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í.