2011-01-28 12 views
74

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íaT-SQL: Usar un CASO en una instrucción UPDATE para actualizar ciertas columnas dependiendo de una condición

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

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

+0

Suponiendo que todo en la misma tabla, sí.Siempre puede ejecutarlo en una transacción y revertirlo por error para verlo usted mismo. –

+0

No estoy seguro de lo que quieres decir. He intentado poner un condicional para la columna, pero no funciona. Funciona para una declaración de selección, pero no para una declaración de actualización. (Seleccione (caso (condición) cuando sea verdadero, luego columnx else) de myTable ... la actualización no funciona, y puedo ver por qué. No lo hace. Parece una manera de hacer que funcione. – pqsk

Respuesta

135

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

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

Ésta es semánticamente lo mismo, pero sólo tener en cuenta que siempre se actualizarán las dos columnas. Este probablemente no le causará ningún problema, pero si tiene un volumen transaccional alto, esto podría causar problemas de concurrencia.

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

+0

Estoy de acuerdo con el SQL dinámico. Entonces, ¿se verán afectados mis datos? Quiero decir que no quiero que cambie para ciertas condiciones. ¿Entonces solo reinserta lo que ya está allí? La cantidad de visitas a la base de datos puede no ser tan mala. – pqsk

+0

@pqsk: Esto no debería afectar sus datos, solo debería reinsertar lo que ya está allí para cualquier columna que * no * se supone que se verá afectada. –

+0

Gracias. Voy a ir con esto. Tan simple, incluso un hombre de las cavernas puede hacerlo. jaja. – pqsk

18
UPDATE table 
SET  columnx = CASE WHEN condition THEN 25 ELSE columnx END, 
     columny = CASE WHEN condition THEN columny ELSE 25 END 
+0

¿Acabas de copiar la respuesta de Adam, o se tomó de otra parte? Jaja. Acabo de notar que. – pqsk

+1

@ pqsk: Nuestras respuestas fueron ~ 1 minuto de diferencia, así que me imagino que solo hizo clic en enviar un poco más rápido;) –

+19

@pqsk: sí, acabo de copiar la respuesta de Adam, '23' segundos antes de que lo publicara. ¡Soy una copiadora rápida! – Quassnoi

-1

yo creo que se puede omitir la actualización de las columnas "no deseados" mediante el ajuste de las otras respuestas de la siguiente manera:
update table set columnx = (case when condition1 then 25 end), columny = (case when condition2 then 25 end)

Como yo lo entiendo, esto actualizará sólo cuando se cumple 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 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 ejemplo:
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 asuma que puede escribir una condicional que maneja nulos. Para mi ejemplo, supongo que ha escrito un condicional tal que evalúe como verdadero, falso o nulo. Si necesita ayuda con esto, avíseme y haré mi mejor esfuerzo.

Ahora la ejecución de estas dos líneas de código hace de hecho el cambio X a 25 si y sólo si ColConditional es verdadero (1) e Y a 25 si y sólo si ColConditional es Falso (0)

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

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

+1

Esto en realidad no funciona. Por un lado, si la columna permite valores nulos, cuando la condición no se cumple se asigna un valor nulo. En el caso de que no se permitan nulos, la actualización fallará. Su última consulta "eficiente" es SQL no válido, al menos en TSQL. ¿Has probado esto en un motor específico y funcionó para ti? – pqsk

+0

Esto no funciona. El valor NULL se actualiza. –

+0

Probé esto en SQL Server 2005 y funciona perfectamente como se muestra. Me gustaría saber por qué no se votó y un ejemplo que muestra el valor NULL actualizado, porque en mi prueba anterior, el valor nulo no se actualiza. Siempre he pensado que la respuesta más simple es la mejor, y si estoy trabajando con una base de datos con millones de registros, seguro que no quiero actualizar las filas innecesarias. –

1

enter image description here

que desea cambiar o actualizar mi ContactNo a 8018070999 8018070777 donde hay uso de instrucción Case

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

enter image description here

+1

para esto, por qué no usar esta consulta ACTUALIZAR [Contactos] SET contactNo = 8018070999 WHERE contactNo = 8018070777 – newGuy

Cuestiones relacionadas