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

Insérer en continu toutes les combinaisons uniques rencontrées de trois identifiants

Comme @a_horse_with_no_name l'a déjà indiqué :la fonction unnest() aplatit non seulement la première dimension, mais tous les éléments imbriqués. Il crée donc une ligne par entier. Cela se traduit bien sûr par une colonne avec (dans votre cas) six valeurs. Voici ce que signifie le message d'exception :vous générez une colonne, mais trois étaient attendues.

Vous avez donc besoin d'une solution pour désimbriquer uniquement la première dimension. J'utilise les solutions présentées ici :

démo :db<>violon

Création de la fonction de Lukas :

CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray)
  RETURNS SETOF anyarray AS
$func$
SELECT array_agg($1[d1][d2])
FROM   generate_subscripts($1,1) d1
    ,  generate_subscripts($1,2) d2
GROUP  BY d1
ORDER  BY d1
$func$  LANGUAGE sql IMMUTABLE;

Celui-ci désimbrique uniquement la première dimension. Vous pouvez donc l'utiliser à la place de votre essai unnest() dans votre fonction :

CREATE OR REPLACE function create_combinations_if_needed(p_combinations integer[][]) RETURNS boolean
LANGUAGE sql AS
$$
   INSERT INTO combinations (some_id1, some_id2, some_id3)
   SELECT unnest[1], unnest[2], unnest[3]
   FROM unnest_2d_1d(p_combinations) as unnest
   ON CONFLICT (some_id1, some_id2, some_id3)
   DO NOTHING
   RETURNING TRUE;
$$;