sql >> Base de Datos >  >> RDS >> PostgreSQL

Inserte continuamente todas las combinaciones únicas encontradas de tres ID

Como ya dijo @a_horse_with_no_name:la función unnest() aplana no solo la primera dimensión sino todos los elementos anidados. Entonces crea una fila por entero. Eso, por supuesto, da como resultado una columna con (en su caso) seis valores. Esto es lo que significa el mensaje de excepción:genera una columna pero se esperaban tres.

Por lo tanto, necesita una solución para anular solo la primera dimensión. Estoy usando las soluciones presentadas aquí :

demostración:db<>fiddle

Creando la función 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;

Este está desanidando solo la primera dimensión. Entonces puede usarlo en lugar de su prueba unnest() dentro de su función:

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