sql >> Database >  >> RDS >> PostgreSQL

Voeg continu alle unieke combinaties van drie ID's in

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 :

demo:db<>fiddle

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



  1. een mysql-query herhalen

  2. MySQL-instructie om de laatste invoer van een specifieke kolom te selecteren

  3. java.time.LocalDate.getDayOfWeek() naar java.util.Calendar.get(DAY_OF_WEEK)

  4. MySQL/Amazon RDS-fout:u heeft geen SUPER-rechten...