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