Actualice varias filas en la misma consulta usando PostgreSQL

Resuelto newUserNameHere asked hace 11 años • 10 respuestas

Estoy buscando actualizar varias filas en PostgreSQL en una sola declaración. ¿Hay alguna manera de hacer algo como lo siguiente?

UPDATE table 
SET 
 column_a = 1 where column_b = '123',
 column_a = 2 where column_b = '345'
newUserNameHere avatar Sep 14 '13 09:09 newUserNameHere
Aceptado

También puede utilizar update ... fromla sintaxis y utilizar una tabla de mapeo. Si desea actualizar más de una columna, es mucho más generalizable:

update test as t set
    column_a = c.column_a
from (values
    ('123', 1),
    ('345', 2)  
) as c(column_b, column_a) 
where c.column_b = t.column_b;

Puedes agregar tantas columnas como quieras:

update test as t set
    column_a = c.column_a,
    column_c = c.column_c
from (values
    ('123', 1, '---'),
    ('345', 2, '+++')  
) as c(column_b, column_a, column_c) 
where c.column_b = t.column_b;

sql fiddle demo

Roman Pekar avatar Sep 14 '2013 07:09 Roman Pekar

Según la solución de @Roman, puede establecer varios valores:

update users as u set -- postgres FTW
  email = u2.email,
  first_name = u2.first_name,
  last_name = u2.last_name
from (values
  (1, '[email protected]', 'Hollis', 'Connell'),
  (2, '[email protected]', 'Robert', 'Duncan')
) as u2(id, email, first_name, last_name)
where u2.id = u.id;
Benjamin Crouzier avatar Nov 03 '2014 14:11 Benjamin Crouzier

Sí tu puedes:

UPDATE foobar SET column_a = CASE
   WHEN column_b = '123' THEN 1
   WHEN column_b = '345' THEN 2
END
WHERE column_b IN ('123','345')

Y prueba funcional: http://sqlfiddle.com/#!2/97c7ea/1

zero323 avatar Sep 14 '2013 02:09 zero323