PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Aggiornamento in blocco in postgreSQL utilizzando unnest

Stai chiamando unnest 3 volte su FROM clausola, ciò significa che stai facendo un CROSS JOIN (prodotto cartesiano) del 3.

Se utilizzi PostgreSQL 9.4 o versioni successive, puoi semplicemente eseguire una chiamata di unnest dando ogni array come input:

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)

Un'altra opzione, per qualsiasi versione, è aggiungere la chiamata a unnest in SELECT invece di 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 entrambi i casi, ma specialmente nell'ultimo, devi assicurarti che ogni array abbia esattamente lo stesso numero di elementi. In caso contrario sul primo metodo, ogni riga mancante verrà riempita come NULL, ma la seconda restituirà tante righe quante sono LCM del numero di righe restituite da ciascuna, ciò che probabilmente non vuoi. Esempio:

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)

Consulta la documentazione su chiamate a funzioni tabella per ulteriori informazioni.