sql >> Databasteknik >  >> RDS >> PostgreSQL

Massuppdatering i postgreSQL med unnest

Du ringer unnest 3 gånger på FROM klausul, det betyder att du gör en CROSS JOIN (kartesisk produkt) av 3.

Om du använder PostgreSQL 9.4 eller högre kan du enkelt göra ett anrop av unnest ger varje array som indata:

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)

Ett annat alternativ, för alla versioner, är att lägga till anropet till unnest i SELECT istället för 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

I båda fallen, men speciellt i det sista, måste du vara säker på att varje array har exakt samma antal element. Om det inte gör det på den första metoden kommer varje saknad rad att fyllas som NULL, men den andra kommer att returnera lika många rader som LCM av antalet rader som returneras av var och en, vad du förmodligen inte vill ha. Exempel:

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)

Kontrollera dokumentationen om anrop av tabellfunktioner för mer information.



  1. MYSQL-servern har försvunnit

  2. Databasen tas inte bort när du avinstallerar Android-appen

  3. Mysql-slaven uppdateras inte

  4. Hur man frågar data från databasen med hjälp av frågesträngsvärden