PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Inserisci continuamente tutte le combinazioni univoche incontrate di tre ID

Come già affermato da @a_horse_with_no_name:la funzione unnest() appiattisce non solo la prima dimensione ma tutti gli elementi nidificati. Quindi crea una riga per intero. Ciò ovviamente si traduce in una colonna con (nel tuo caso) sei valori. Questo è il significato del messaggio di eccezione:hai generato una colonna ma ne erano previste tre.

Quindi, hai bisogno di una soluzione per disnidificare solo la prima dimensione. Sto utilizzando le soluzioni presentate qui :

demo:db<>violino

Creazione della funzione di 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;

Questo sta snidando solo la prima dimensione. Quindi puoi usarlo al posto del tuo unnest() try all'interno della tua funzione:

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;
$$;