sql >> Databáze >  >> RDS >> PostgreSQL

Průběžně vkládejte všechny jedinečné kombinace tří ID

Jak již uvedl @a_horse_with_no_name:Funkce unnest() sloučí nejen první dimenzi, ale všechny vnořené prvky. Vytvoří tedy jeden řádek na celé číslo. To samozřejmě vede k jednomu sloupci s (ve vašem případě) šesti hodnotami. Toto znamená zpráva o výjimce:Vygenerujete jeden sloupec, ale byly očekávány tři.

Takže potřebujete řešení, jak rozpojit pouze první dimenzi. Používám řešení uvedená zde :

demo:db<>fiddle

Vytvoření Lukasovy funkce:

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;

Tento rozkládá pouze první dimenzi. Můžete jej tedy použít místo vaší unnest() try ve vaší funkci:

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



  1. Odstranění znaku odrážky Unicode

  2. Nelze otevřít připojení způsobené tím, že tato sada výsledků je uzavřena

  3. Dynamický (Column Based) Interval

  4. Více hodnot v jednom sloupci nebo ne?