sql >> Database >  >> RDS >> PostgreSQL

Bulkupdate in postgreSQL met behulp van unnest

Je belt unnest 3 keer op FROM clausule, dat betekent dat je een CROSS JOIN . doet (cartesisch product) van de 3.

Als u PostgreSQL 9.4 of hoger gebruikt, kunt u eenvoudig een aanroep doen van unnest elke array als invoer geven:

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)

Een andere optie, voor elke versie, is om de aanroep toe te voegen aan unnest in SELECT in plaats van 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

In beide gevallen, maar vooral in het laatste geval, moet u er zeker van zijn dat elke array exact hetzelfde aantal elementen heeft. Als dit niet het geval is bij de eerste methode, zal elke ontbrekende rij worden gevuld als NULL, maar de tweede zal evenveel rijen retourneren als de LCM van het aantal rijen dat door elk wordt geretourneerd, wat u waarschijnlijk niet wilt. Voorbeeld:

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)

Raadpleeg de documentatie over aanroepen van tabelfuncties voor meer informatie.



  1. Lastige SQL-instructie over 3 tabellen

  2. Hoe te controleren of de mysql-database bestaat

  3. unaccent() voorkomt indexgebruik in Postgres

  4. Herschrijft Postgres de hele rij bij update?