जैसा कि @a_horse_with_no_name पहले ही कहा जा चुका है:unnest() फ़ंक्शन न केवल पहले आयाम बल्कि सभी नेस्टेड तत्वों को समतल करता है। तो यह प्रति पूर्णांक एक पंक्ति बनाता है। वह, निश्चित रूप से एक कॉलम में (आपके मामले में) छह मानों के साथ परिणाम देता है। अपवाद संदेश का यही अर्थ है:आप एक कॉलम जेनरेट करते हैं लेकिन तीन अपेक्षित थे।
तो, आपको केवल पहले आयाम को खोलने के लिए एक समाधान की आवश्यकता है। मैं प्रस्तुत समाधानों का उपयोग कर रहा हूँ यहां :
- https://stackoverflow.com/a/8142998/3984221 @LukasEklund और @ErwinBrandstetter . से
लुकास फ़ंक्शन बनाना:
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;
$$;