PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Remplir les tableaux avec NULL jusqu'à la longueur maximale pour la fonction d'agrégation personnalisée

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 pour NULL .
  • 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.