Zoals @a_horse_with_no_name al zei:de functie unnest() maakt niet alleen de eerste dimensie plat, maar alle geneste elementen. Dus het creëert één rij per geheel getal. Dat resulteert natuurlijk in één kolom met (in jouw geval) zes waarden. Dit is wat het uitzonderingsbericht betekent:u genereert één kolom, maar er werden er drie verwacht.
Je hebt dus een oplossing nodig om alleen de eerste dimensie te ontrafelen. Ik gebruik de oplossingen die hier worden gepresenteerd :
- https://stackoverflow.com/a/8142998/3984221 van @LukasEklund en @ErwinBrandstetter
De functie van Lukas maken:
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;
Deze maakt alleen de eerste dimensie los. Dus je kunt het gebruiken in plaats van je unnest() probeer het binnen je functie:
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;
$$;