Както @a_horse_with_no_name вече каза:Функцията unnest() изравнява не само първото измерение, но и всички вложени елементи. Така че създава един ред на цяло число. Това, разбира се, води до една колона с (във вашия случай) шест стойности. Ето какво означава съобщението за изключение:Генерирате една колона, но се очакват три.
И така, имате нужда от решение за разместване само на първото измерение. Използвам решенията, представени тук :
- https://stackoverflow.com/a/8142998/3984221 от @LukasEklund и @ErwinBrandstetter
Създаване на функцията на 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;
Това разгражда само първото измерение. Така че можете да го използвате вместо опита си 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;
$$;