Wie @a_horse_with_no_name bereits gesagt hat:Die Funktion unnest() flacht nicht nur die erste Dimension ab, sondern alle verschachtelten Elemente. Es wird also eine Zeile pro Ganzzahl erstellt. Das ergibt natürlich eine Spalte mit (in Ihrem Fall) sechs Werten. Die Ausnahmemeldung bedeutet Folgendes:Sie generieren eine Spalte, aber es wurden drei erwartet.
Sie brauchen also eine Lösung, um nur die erste Dimension zu entschachteln. Ich verwende die Lösungen, die hier vorgestellt werden :
- https://stackoverflow.com/a/8142998/3984221 von @LukasEklund und @ErwinBrandstetter
Erstellen der 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;
Dieser entschachtelt nur die erste Dimension. Sie können es also anstelle Ihres unnest()-Versuchs innerhalb Ihrer Funktion verwenden:
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;
$$;