2012-03-15 20 views
6

Quiero actualizar una tabla en MySQL como esto:Cómo usar If Then Else en una consulta de actualización de MySQL?

UPDATE Table 
SET A = '20' IF A > 20 
SET A = A IF A < 20 
SET A = 0 IF A <= 1 
WHERE A IS NOT NULL; 

Pero el SQL anterior no es una sintaxis válida. También probé esto:

UPDATE table 
SET A = IF(A > 20, 20, IF(A < 20, A, 0)); 

Pero tampoco es válida. ¿Cómo uso una instrucción if en una consulta de actualización como esta?

+1

No necesita el segundo caso. Establecer A = A no hace nada. Filtre esto en la cláusula where, debería ser más rápido: 'DONDE A NO ES NULO Y (A> 20 O A <= 1)' – Andre

Respuesta

9

creo que usted era 99% no:

UPDATE table 
SET A = IF(A > 20, 20, IF(A < 20 && A > 1, A, 0)) 
WHERE A IS NOT NULL; 

Añadir la && A > 1 a la segunda instrucción SI y su tercera condición es satisfecha.

Editar:

por @ comentarios de Andre a la pregunta y la sugerencia de que el anidado IF es difícil de leer, también se puede hacer esto como un par de consultas que no hace ningún trabajo innecesario y son legibles:

UPDATE table SET A = 20 WHERE A > 20; 
UPDATE table SET A = 0 WHERE A <= 1; 

Cuando a es NULL, no cumplirá ninguna de estas condiciones, y por lo tanto elimina la necesidad de especificar que a no ser nulo.

A continuación, no hay necesidad de la tercera condición como @Andre sugirió. Si A está entre 1 y 20, se queda tal como está.

Por último, ajustar A a 0 donde A es menor o igual a 1 parece inusual. Los valores de 1 se cambiarán a 0. Si tiene la intención simplemente de establecer valores inferiores a 1 (incluidos los valores negativos) en 0, debe cambiar < por <=.

+0

¿crees que es fácil de leer? ¡yo no! –

5
UPDATE Table 
SET A = Case 
When A > 20 Then 20 
When A <= 1 Then 0 
End 
WHERE A IS NOT NULL and (A > 20 or A <= 1) 

o, más sencillamente, 2 declaraciones

UPDATE Table 
SET A = 20 
where A > 20; 

UPDATE Table 
SET A = 0 
where A <= 1; 
+1

¿No deberían los casos omitir las comillas simples para usar valores int (en lugar de literales de cadenas como '20' y 'A', etc.)? – JYelton

+0

es ilustrativo, su original tiene desajustes de tipo similar que no quería adivinar –

+0

Buen punto. Aunque si el valor almacenado es un int, compararlo con '20' funcionará en mysql, igualmente establecerlo en '20' también funcionará, ya que mysql evaluará y convertirá la cadena <-> int. Sin embargo, 'A' dará como resultado un tipo de error. – JYelton

Cuestiones relacionadas