Utilizzando la funzione di aggregazione personalizzata array_agg_mult()
come definito in questa risposta correlata:
Il risultato atteso è impossibile:
{{1},NULL,{abc}}
Dovrebbe essere:
{{1},{NULL},{abc}}
Caso semplice con 0 o 1 elementi dell'array
Per il semplice caso di sostituire semplicemente l'array vuoto:puoi ottenerlo con:
WITH t(arr) AS (
VALUES
('{1}'::text[])
,('{}')
,('{abc}')
)
SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
FROM t;
Padding dinamico per n elementi
Usando array_fill()
per riempire gli array con elementi NULL fino alla lunghezza massima:
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;
Funziona ancora solo per monodimensionale array di base.
Spiega
- Subquery
t1
calcola la lunghezza massima dell'array unidimensionale di base. COALESCE(array_length(arr, 1), 0)
calcola la lunghezza dell'array in questa riga.COALESCE
il valore predefinito è0
perNULL
.- Genera un array di riempimento per la differenza di lunghezza con
array_fill()
. - Aggiungilo a
arr
con||
- Aggrega come sopra con
array_agg_mult()
.
SQL Fiddle.
dimostrando tutti .
L'output in SQL Fiddle è fuorviante, quindi ho lanciato il risultato sul testo lì.