PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Massenaktualisierung in PostgreSQL mit Unnest

Sie rufen unnest auf 3 mal auf FROM -Klausel, das heißt, Sie machen einen CROSS JOIN (kartesisches Produkt) der 3.

Wenn Sie PostgreSQL 9.4 oder höher verwenden, können Sie einfach einen Aufruf von unnest ausführen Geben Sie jedes Array als Eingabe:

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)

Eine weitere Option für jede Version besteht darin, den Aufruf unnest hinzuzufügen in SELECT statt 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 beiden Fällen, besonders aber im letzten, müssen Sie sicher sein, dass jedes Array genau die gleiche Anzahl von Elementen hat. Wenn dies bei der ersten Methode nicht der Fall ist, wird jede fehlende Zeile als NULL gefüllt, aber bei der zweiten werden so viele Zeilen zurückgegeben, wie der LCM der Anzahl der Zeilen, die von jedem zurückgegeben werden, was Sie wahrscheinlich nicht wollen. Beispiel:

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)

Überprüfen Sie die Dokumentation zu Aufrufen von Tabellenfunktionen für weitere Informationen.