PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Insira continuamente todas as combinações únicas encontradas de três IDs


Como @a_horse_with_no_name já afirmou:A função unnest() nivela não apenas a primeira dimensão, mas todos os elementos aninhados. Então, ele cria uma linha por inteiro. Isso, é claro, resulta em uma coluna com (no seu caso) seis valores. Isto é o que a mensagem de exceção significa:Você gera uma coluna, mas três eram esperadas.

Portanto, você precisa de uma solução para desaninhar apenas a primeira dimensão. Estou usando as soluções apresentadas aqui :

demo:db<>fiddle

Criando a função do 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;

Este está desaninhando apenas a primeira dimensão. Então você pode usá-lo em vez de seu unnest() try dentro de sua função:
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;
$$;