2010-02-01 108 views
32

如何在条件评估为True时更新表并设置不同的值。MySQL - 在MySQL UPDATE或SELECT查询中使用If If Then

例如:

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; 

我已经看到了过程和函数CASE表达式和IF表达,但我想在一个简单的更新/ SELECT语句中使用它。是否有可能或者我对这个可爱的开源数据库期待过多?

回答

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; 

您可能需要使用CEIL()如果A始终是一个浮点值> 0<= 2

+0

值只是举例。我想将它应用于任何条件。例如:如果一个IS NOT NULL SET设置为'Some Varchar Value'ELSE SET设置为'Some Other Varchar Value';我会给你的解决方案一个镜头,看看它是如何工作的。非常感谢! – ThinkCode 2010-02-01 15:58:49

+0

你有没有参考你在做什么?我目前看不到它.. – inetphantom 2015-04-01 09:45:28

6

这里有一个查询更新基于另一个表的比较表。如果tableB中没有找到记录,它会将“活动”值更新为“n”。如果发现,将值设为NULL

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

希望这可以帮助别人。

16

虽然你肯定可以使用MySQL的IF()控制流功能as demonstrated by dbemerlin's answer,我怀疑这可能是一个更清晰一点的读者(即自己和未来的任何开发谁可以拿起您在未来的代码)使用CASE表达式代替:

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 

当然,在该特定示例中它是一个小的浪费设置A到本身在ELSE子句更好完全过滤从UPDATE这样的条件下,经由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) 

(不等式需要A IS NOT NULL)。

或者,如果你想要的时间间隔被关闭,而不是开(注意 - 如果这是不可取的,这将设置01,该WHERE子句中人们可以明确地筛选这样的情况下,否则增加一个更高优先WHEN条件):

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 

虽然,作为dbmerlin还指出,对于这种特定情况下,你可以考虑使用替代CEIL():A中的

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

这是一个更简洁的演示文稿,即使有两个以上的条件也可以普遍使用。 @dbemerlin提供的'if()'语句解决方案需要嵌套两个条件,这会使逻辑更难以阅读和理解。 – 2015-07-29 00:53:05