PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Fügen Sie fortlaufend alle eindeutigen Kombinationen von drei IDs ein, die gefunden wurden

Wie @a_horse_with_no_name bereits gesagt hat:Die Funktion unnest() flacht nicht nur die erste Dimension ab, sondern alle verschachtelten Elemente. Es wird also eine Zeile pro Ganzzahl erstellt. Das ergibt natürlich eine Spalte mit (in Ihrem Fall) sechs Werten. Die Ausnahmemeldung bedeutet Folgendes:Sie generieren eine Spalte, aber es wurden drei erwartet.

Sie brauchen also eine Lösung, um nur die erste Dimension zu entschachteln. Ich verwende die Lösungen, die hier vorgestellt werden :

demo:db<>fiddle

Erstellen der Lukas-Funktion:

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;

Dieser entschachtelt nur die erste Dimension. Sie können es also anstelle Ihres unnest()-Versuchs innerhalb Ihrer Funktion verwenden:

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