2011-04-25 21 views

Respuesta

16

Simplemente puede combinar una actualización con una declaración tal caso

UPDATE records 
    SET name = 
    CASE 
     WHEN id = 3 THEN 'abc' 
     WHEN id = 1 THEN 'def' 
     ELSE name 
    END 
+2

Creo que debe tener un 'where' en eso, de lo contrario, hará una actualización en todos los registros en la tabla. – Guffa

+0

@Guffa Tiene un punto válido y estoy de acuerdo con la cláusula 'where'. La desventaja de esto es que necesitamos asegurarnos de que las condiciones en 'case' y' where' sean las mismas. Claro, mi solución actualiza todas las filas, pero para las filas que no entran en estas condiciones, se actualizan de 'nombre' a' nombre', lo que obviamente no cambia nada –

+5

En la mayoría de los casos, no cambia nada, pero imagine que hay un disparador en la actualización que registra todas las filas cambiadas en otra tabla ... – Guffa

5
;WITH vals(id, name) 
    AS (SELECT 3,'abc' 
     UNION ALL 
     SELECT 1,'def') 
UPDATE r 
SET name = vals.name 
FROM records r 
     JOIN vals 
     ON vals.id = r.id 
+0

Gracias, hecho mi trabajo desde esta consulta. –

16

Por tan sólo unos pocos registros, se puede utilizar:

update records 
set name = case id 
    when 1 then 'def' 
    when 3 then 'abc' 
end 
where id in (1, 3) 

un poco más flexible es crear un resultado que puede unirse a la actualización

update r 
set name = x.name 
from records r 
inner join (
    select id = 1, name = 'abc' union all 
    select 3, 'def' union all 
    select 4, 'qwe' union all 
    select 6, 'rty' 
) x on x.id = r.id 
+0

¡Brillante! ¡Gracias! –

+2

¿Por qué el voto a favor? Si no explica qué es lo que cree que está mal, no puede mejorar la respuesta. – Guffa

+0

Esta debería ser la respuesta aceptada. –

3

estándar SQL: 2003 sintaxis (funciona en SQL Server 2008 en adelante):

MERGE INTO records 
    USING (
      VALUES (1, 'def'), 
       (3, 'abc') 
     ) AS T (id, name) 
     ON records.id = T.id 
WHEN MATCHED THEN 
    UPDATE 
     SET name = T.name; 

Tenga en cuenta que NAME y RECORDS son palabras reservadas de SQL.

Cuestiones relacionadas