@a_horse_with_no_nameがすでに述べたように、unnest()関数は、最初の次元だけでなく、ネストされたすべての要素を平坦化します。したがって、整数ごとに1つの行が作成されます。もちろん、(あなたの場合は)6つの値を持つ1つの列になります。これが例外メッセージの意味です。1つの列を生成しましたが、3つが予期されていました。
したがって、最初の次元のみを解き明かすソリューションが必要です。 こちら で提示されているソリューションを使用しています :
- https://stackoverflow.com/a/8142998/3984221 @LukasEklundと@ErwinBrandstetterから
Lukasの関数の作成:
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;
これは最初の次元のみをネスト解除しています。したがって、関数内でunnest()を試す代わりに使用できます:
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;
$$;