T-SQL: Uso de un CASO en una instrucción UPDATE para actualizar ciertas columnas en función de una condición


Me pregunto si esto es posible en absoluto. Quiero actualizar la columna x si una condición es verdadera, de lo contrario la columna y se actualizaría

UPDATE table SET
     (CASE (CONDITION) WHEN TRUE THEN columnx
                       ELSE columny
      END)
= 25

He buscado por todas partes, probado algunas cosas y soy incapaz de encontrar una solución. Creo que no es posible, pero pensé en preguntar aquí y ver si alguien lo ha hecho antes. Gracias de antemano.

Author: Juan Mellado, 2011-01-28

4 answers

No puede usar una condición para cambiar la estructura de su consulta, solo los datos involucrados. Usted podría hacer esto:

update table set
    columnx = (case when condition then 25 else columnx end),
    columny = (case when condition then columny else 25 end)

Esto es semánticamente lo mismo, pero solo tenga en cuenta que ambas columnas siempre se actualizarán. Esto probablemente no le causará ningún problema, pero si tiene un volumen transaccional alto, entonces esto podría causar problemas de concurrencia.

La única manera de hacer específicamente lo que estás pidiendo es usar SQL dinámico. Esto es, sin embargo, algo de lo que te animaría a mantenerte alejado. La solución anterior casi seguramente será suficiente para lo que buscas.

 148
Author: Adam Robinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-28 16:21:14
UPDATE  table
SET     columnx = CASE WHEN condition THEN 25 ELSE columnx END,
        columny = CASE WHEN condition THEN columny ELSE 25 END
 20
Author: Quassnoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-28 15:55:21

introduzca la descripción de la imagen aquí

Quiero cambiar o actualizar mi contactNo al 8018070999 donde hay 8018070777 usando la instrucción Case

update [Contacts] set contactNo=(case 
when contactNo=8018070777 then 8018070999
else
contactNo
end)

introduzca la descripción de la imagen aquí

 1
Author: Debendra Dash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-26 12:30:15

Creo que puede omitir la actualización de las columnas "no deseadas" ajustando las otras respuestas de la siguiente manera:
update table set columnx = (case when condition1 then 25 end), columny = (case when condition2 then 25 end)

Según lo entiendo, esto se actualizará solo cuando se cumpla la condición.

Después de leer todos los comentarios, este es el más eficiente:
Update table set ColumnX = 25 where Condition1 Update table set ColumnY = 25 where Condition1

Tabla de muestra:
CREATE TABLE [dbo].[tblTest]( [ColX] [int] NULL, [ColY] [int] NULL, [ColConditional] [bit] NULL, [id] [int] IDENTITY(1,1) NOT NULL ) ON [PRIMARY]
Datos de muestra:
Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 0) Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 0) Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 1) Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 1) Insert into tblTest (ColX, ColY, ColConditional) values (1, null, null) Insert into tblTest (ColX, ColY, ColConditional) values (2, null, null) Insert into tblTest (ColX, ColY, ColConditional) values (null, 1, null) Insert into tblTest (ColX, ColY, ColConditional) values (null, 2, null)

Ahora asumo que puedes escribir un condicional que maneje nulos. Para mi ejemplo, estoy asumiendo que usted ha escrito tal condicional que se evalúa como Verdadero, Falso o Nulo. Si necesitas ayuda con esto, házmelo saber y haré lo mejor que pueda.

Ahora, ejecutar estas dos líneas de código cambia de hecho X a 25 si y solo si ColConditional es True(1) e Y a 25 si y solo si ColConditional es False(0)

Update tblTest set ColX = 25 where ColConditional = 1 Update tblTest set ColY = 25 where ColConditional = 0

P.d. El caso nulo nunca se mencionó en la pregunta original ni en ninguna actualización de la pregunta, pero como puede ver, esta respuesta muy simple los maneja de todos modos.

 -1
Author: John Greiner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-12 21:29:31