Utilisation de la fonction d'agrégation personnalisée array_agg_mult()
comme défini dans cette réponse connexe :
Votre résultat attendu est impossible :
{{1},NULL,{abc}}
Devrait être :
{{1},{NULL},{abc}}
Cas simple avec 0 ou 1 éléments de tableau
Pour le cas simple, remplacer simplement le tableau vide :vous pouvez y parvenir avec :
WITH t(arr) AS (
VALUES
('{1}'::text[])
,('{}')
,('{abc}')
)
SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
FROM t;
Remplissage dynamique pour n éléments
Utilisation de array_fill()
pour remplir les tableaux avec des éléments NULL jusqu'à la longueur maximale :
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;
Ne fonctionne toujours que pour 1 dimension tableaux de base.
Expliquez
- Sous-requête
t1
calcule la longueur maximale du tableau de base à une dimension. COALESCE(array_length(arr, 1), 0)
calcule la longueur du tableau dans cette ligne.COALESCE
par défaut à0
pourNULL
.- Générer un tableau de remplissage pour la différence de longueur avec
array_fill()
. - Ajouter cela à
arr
avec||
- Agréger comme ci-dessus avec
array_agg_mult()
.
SQL Fiddle.
démontrant tout .
La sortie dans SQL Fiddle est trompeuse, donc j'y convertis le résultat en texte.