Seperti yang sudah dinyatakan oleh @a_horse_with_no_name:Fungsi unnest() meratakan tidak hanya dimensi pertama tetapi semua elemen bersarang. Jadi itu menciptakan satu baris per bilangan bulat. Itu, tentu saja menghasilkan satu kolom dengan (dalam kasus Anda) enam nilai. Inilah yang dimaksud dengan pesan pengecualian:Anda menghasilkan satu kolom tetapi diharapkan tiga.
Jadi, Anda memerlukan solusi untuk menghilangkan sarang hanya pada dimensi pertama. Saya menggunakan solusi yang disajikan di sini :
- https://stackoverflow.com/a/8142998/3984221 dari @LukasEklund dan @ErwinBrandstetter
Membuat fungsi 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;
Yang ini hanya membongkar dimensi pertama. Jadi Anda dapat menggunakannya sebagai ganti unnest() Anda mencoba dalam fungsi Anda:
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;
$$;