2010-02-01 20 views
32

¿Cómo actualizo una tabla y establezco valores diferentes sobre la condición que evalúa como True?MySQL - Usar If Then Else en MySQL UPDATE o SELECT Consultas

Por ejemplo:

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

he visto la expresión CASE y si la expresión de procedimientos y funciones, pero quiero utilizarlo en un simple actualización/instrucción de selección. ¿Es posible o estoy esperando demasiado de esta encantadora base de datos de código abierto?

Respuesta

41
UPDATE table 
SET A = IF(A > 0 AND A < 1, 1, IF(A > 1 AND A < 2, 2, A)) 
WHERE A IS NOT NULL; 

es posible que desee utilizar CEIL() si A es siempre un valor de punto flotante y > 0<= 2

+0

valores de a una re solo ejemplos. Quiero aplicarlo a cualquier condición. Por ejemplo: SI A NO ES NULO ESTABLECIDO en 'Algún valor varchar' ELSE SET en 'Algún otro valor Varchar'; Le daré una oportunidad a su solución y veré cómo funciona. ¡Muchas gracias! – ThinkCode

+0

¿Tiene alguna referencia de lo que está haciendo? No puedo verlo en este momento .. – inetphantom

6

Aquí hay una consulta para actualizar una tabla basada en una comparación de otra tabla. Si el registro no se encuentra en la tabla B, actualizará el valor "activo" a "n". Si se encuentra, establecerá el valor en NULL

UPDATE tableA 
LEFT JOIN tableB ON tableA.id = tableB.id 
SET active = IF(tableB.id IS NULL, 'n', NULL)"; 

Espero que esto ayude a alguien más.

16

Mientras que sin duda puede utilizar la función de flujo IF() de control de MySQL as demonstrated by dbemerlin's answer, sospecho que podría ser un poco más claro para el lector (es decir, a sí mismo, y cualquier desarrolladores futuros que podrían recoger a su código en el futuro) para utilizar una CASE expresión en lugar:

UPDATE Table 
SET A = CASE 
     WHEN A > 0 AND A < 1 THEN 1 
     WHEN A > 1 AND A < 2 THEN 2 
     ELSE A 
     END 
WHERE A IS NOT NULL 

por supuesto, en este ejemplo específico que es un poco desperdicio para establecer A a sí mismo en la ELSE cláusula de la mejor enteramente para filtrar tales condiciones de la UPDATE, a través de la cláusula WHERE:

UPDATE Table 
SET A = CASE 
     WHEN A > 0 AND A < 1 THEN 1 
     WHEN A > 1 AND A < 2 THEN 2 
     END 
WHERE (A > 0 AND A < 1) OR (A > 1 AND A < 2) 

(Las desigualdades implican A IS NOT NULL).

O bien, si desea que los intervalos sean cerradas en vez de abierto (tenga en cuenta que esto sería establecer los valores de 0 a 1 -si esto es indeseable, se podría filtrar de manera explícita tales casos en la cláusula WHERE, o bien añadir un mayor precedencia WHEN condición):

UPDATE Table 
SET A = CASE 
     WHEN A BETWEEN 0 AND 1 THEN 1 
     WHEN A BETWEEN 1 AND 2 THEN 2 
     END 
WHERE A BETWEEN 0 AND 2 

Aunque, como dbmerlin también señaló, para esta situación específica que podría considerar el uso de CEIL() lugar:

UPDATE Table SET A = CEIL(A) WHERE A BETWEEN 0 AND 2 
+1

Esta es una presentación mucho más limpia y funciona universalmente, incluso si hay más de dos condiciones. La solución de enunciado 'if()' que ofrece @dbemerlin requiere anidar después de dos condiciones, lo que hará que la lógica sea aún más difícil de leer y comprender. –

Cuestiones relacionadas