sql >> Databasteknik >  >> RDS >> PostgreSQL

Infoga kontinuerligt alla unika kombinationer som påträffas av tre ID:n

Som @a_horse_with_no_name redan har sagt:Funktionen unnest() plattar inte bara ut den första dimensionen utan alla kapslade element. Så det skapar en rad per heltal. Det resulterar naturligtvis i en kolumn med (i ditt fall) sex värden. Detta är vad undantagsmeddelandet betyder:Du genererar en kolumn men tre förväntades.

Så, du behöver en lösning för att avvärja endast den första dimensionen. Jag använder lösningarna som presenteras här :

demo:db<>fiol

Skapar 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;

Den här löser bara den första dimensionen. Så du kan använda det istället för ditt unnest()-försök inom 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;
$$;



  1. Hur visar man funktionen, proceduren, utlöser källkoden i postgresql?

  2. oratop

  3. Lagra frågeresultat i en variabel som använder i PL/pgSQL

  4. Jag vill ha timmar, min, andra skillnad från två datum och tid