Như @a_horse_with_no_name đã nêu:Hàm unnest () làm phẳng không chỉ thứ nguyên đầu tiên mà tất cả các phần tử lồng nhau. Vì vậy, nó tạo ra một hàng cho mỗi số nguyên. Điều đó, tất nhiên dẫn đến một cột có (trong trường hợp của bạn) sáu giá trị. Đây là ý nghĩa của thông báo ngoại lệ:Bạn tạo một cột nhưng dự kiến sẽ có ba cột.
Vì vậy, bạn cần một giải pháp để chỉ giải phóng chiều thứ nhất. Tôi đang sử dụng các giải pháp được trình bày tại đây :
- https://stackoverflow.com/a/8142998/3984221 từ @LukasEklund và @ErwinBrandstetter
Tạo hàm 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;
Đây chỉ là chiều thứ nhất mà không cần lưu ý. Vì vậy, bạn có thể sử dụng nó thay vì thử unnest () trong hàm của bạn:
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;
$$;