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
t1calcule la longueur maximale du tableau de base à une dimension. COALESCE(array_length(arr, 1), 0)calcule la longueur du tableau dans cette ligne.COALESCEpar défaut à0pourNULL.- Générer un tableau de remplissage pour la différence de longueur avec
array_fill(). - Ajouter cela à
arravec|| - 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.