Som @a_horse_with_no_name allerede har angivet:Funktionen unnest() udflader ikke kun den første dimension, men alle indlejrede elementer. Så det opretter en række pr. heltal. Det resulterer selvfølgelig i én kolonne med (i dit tilfælde) seks værdier. Dette er, hvad undtagelsesmeddelelsen betyder:Du genererer én kolonne, men tre var forventet.
Så du har brug for en løsning til kun at fjerne den første dimension. Jeg bruger de løsninger, der præsenteres her :
- https://stackoverflow.com/a/8142998/3984221 fra @LukasEklund og @ErwinBrandstetter
Oprettelse af Lukas' funktion:
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;
Denne udløser kun den første dimension. Så du kan bruge det i stedet for dit unnest()-forsøg i din funktion:
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;
$$;