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 :
- https://stackoverflow.com/a/8142998/3984221 od @LukasEklund i @ErwinBrandstetter
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;
$$;