PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Ciągle wstawiaj wszystkie unikalne kombinacje napotkane trzech identyfikatorów

Jak już wspomniano @a_koń_bez_nazwy:Funkcja unnest() spłaszcza nie tylko pierwszy wymiar, ale wszystkie zagnieżdżone elementy. Więc tworzy jeden wiersz na liczbę całkowitą. To oczywiście daje jedną kolumnę z (w twoim przypadku) sześcioma wartościami. Oto, co oznacza komunikat o wyjątku:generujesz jedną kolumnę, ale oczekiwano trzech.

Potrzebujesz więc rozwiązania, które rozpakuje tylko pierwszy wymiar. Korzystam z rozwiązań przedstawionych tutaj :

demo:db<>skrzypce

Tworzenie funkcji Lukasa:

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;

Ten rozbija tylko pierwszy wymiar. Możesz więc użyć go zamiast metody unnest() w swojej funkcji:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wstrzymać wykonywanie instrukcji w PostgreSQL

  2. Czy mogę użyć WYJĄTKÓW w PĘTLI FOR, aby wymusić kontynuację w przypadku błędu?

  3. PostgreSQL Fibonacci Sequence - Zapytanie nie ma miejsca docelowego dla danych wynikowych

  4. Równoległe unnest() i porządek sortowania w PostgreSQL

  5. Używanie symfony z postgresql