2012-03-15 65 views
6

我想在MySQL更新表是这样的:如何在MySQL更新查询中使用If Then?

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; 

但上面的SQL是无效的语法。我也试过这个:

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

但是也是无效的语法。如何在像这样的更新查询中使用if语句?

+1

你不需要第二种情况。设置A = A什么都不做。在where子句中过滤,应该更快:'WHERE A NOT NOT NULL AND(A> 20 OR A <= 1)' – Andre 2012-03-15 15:43:21

回答

9

我觉得你99%的有:

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

添加&& A > 1为第二IF语句和第三个条件满足。

编辑:

每@安德烈对问题和建议,嵌套IF是难以阅读,你也可以这样做一对夫妇查询没有做任何不必要的工作意见和是可读:

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

当A是NULL,则不会满足这些条件,从而消除了要指定不能为NULL的需要。

接下来,@Andre建议不需要第三个条件。如果A在1和20之间,它将保持原样。

最后,在A小于或等于1的情况下将A设置为0似乎不常见。如果您打算简单地将小于1(包括负值)的值设置为0,则应该将<替换为<=

+0

你认为这很容易阅读吗?我不! – 2012-03-15 15:49:22

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) 

或者更简单地说,2陈述

UPDATE Table 
SET A = 20 
where A > 20; 

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

不应该忽略单引号来使用int值(而不是字符串文字'20'和'A'等)? – JYelton 2012-03-15 15:43:09

+0

它的说明,他原来有类似的类型不匹配我不想猜 – 2012-03-15 15:43:43

+0

好点。虽然如果存储值是一个int,比较它'20'将在mysql中工作,同样设置为'20'也将工作,因为mysql将评估和转换字符串<-> INT。但是'A'会导致类型错误。 – JYelton 2012-03-15 15:47:44