PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Mise à jour en masse dans postgreSQL en utilisant unnest

Vous appelez unnest 3 fois sur FROM clause, cela signifie que vous faites un CROSS JOIN (produit cartésien) des 3.

Si vous êtes sur PostgreSQL 9.4 ou supérieur, vous pouvez simplement faire un appel de unnest donnant chaque tableau en entrée :

select * from 
         unnest(
            array['2001622', '2001624', '2007903'],
             array[15,14,8],
             array['type1', 'type1', 'type1'],
             array[false, true, true]
        ) as u(id, ver, type, enabled)

Une autre option, pour n'importe quelle version, est d'ajouter l'appel à unnest dans SELECT au lieu de FROM :

select
   unnest(array['2001622', '2001624', '2007903']) as id,
   unnest(array[15,14,8]) as ver,
   unnest(array['type1', 'type1', 'type1']) as type,
   unnest(array[false, true, true]) as enabled

Dans les deux cas, mais surtout dans le dernier cas, vous devez vous assurer que chaque tableau contient exactement le même nombre d'éléments. Si ce n'est pas le cas sur la première méthode, chaque ligne manquante sera remplie comme NULL, mais la seconde renverra autant de lignes que le LCM du nombre de lignes renvoyées par chacun, ce que vous ne voulez probablement pas. Exemple :

SELECT * FROM unnest(array[1,2,3,4], array['a','b','c','d','e','f']);
 unnest | unnest 
--------+--------
      1 | a
      2 | b
      3 | c
      4 | d
 [null] | e
 [null] | f
(6 rows)

SELECT unnest(array[1,2,3,4]), unnest(array['a','b','c','d','e','f']);
 unnest | unnest 
--------+--------
      1 | a
      2 | b
      3 | c
      4 | d
      1 | e
      2 | f
      3 | a
      4 | b
      1 | c
      2 | d
      3 | e
      4 | f
(12 rows)

Consultez la documentation sur les appels de fonctions de table pour plus d'informations.