更新不等于Null

时间:2013-11-19 06:41:19

标签: mysql

它一定很简单,但是我在这个上面撞到了屋顶。

我有一张桌子

   A      B        C
-------------------------
|  1  |   9   |   car   |
|  2  |  NULL |   bike  |
|  3  |   6   |   NULL  |
|  4  |   7   |   car   |
|  5  |   9   |   dog   |
|  6  |  NULL |   cat   |
|  7  |  NULL |   NULL  |

我喜欢更新其中B!= 9或C!= car的行。在这个例子中,它应该更新第2,3,6和7行。

我尝试了WHERE子句的多种组合,但要么更新所有行,要么不更新任何行。

我尝试过的一些事情:

//updates none
UPDATE table SET A=9,B=7,C="mouse" WHERE B<=>"99" OR C<=>"auto"
//updates all rows
UPDATE table SET A=9,B=7,C="mouse" WHERE (B<=>"99" OR B IS NOT NULL) OR (C<=>"auto" OR C IS NOT NULL)
//updates all
UPDATE table SET A=9,B=7,C="mouse" WHERE B IS NULL OR B<=>"99" OR C IS NULL OR C<=>"auto"

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:3)

SQLFiddle Demo

UPDATE table
SET A=9, B=7, C='mouse'
WHERE (B != 9     OR B IS NULL)
  AND (C != 'car' OR C IS NULL)

SQL标准有IS DISTINCT FROM运算符,它将NULL视为可比值,但遗憾的是MySQL不支持它。有了它,您的查询将是:

UPDATE table
SET A=9, B=7, C='mouse'
WHERE B IS DISTINCT FROM 9
  AND C IS DISTINCT FROM 'car'

(这适用于PostgreSQL)。

答案 1 :(得分:1)

这应该是

UPDATE table SET A=9,B=7,C='mouse' 
WHERE (B !='9' or B is null) 
and  (C!='car' or C is null);

答案 2 :(得分:1)

到目前为止,所有答案都忽略了痛苦简单的<=>零安全等式运算符。

WHERE (NOT B <=> 9)
  AND (NOT C <=> 'car');

http://dev.mysql.com/doc/refman/5.6/en/comparison-operators.html#operator_equal-to

此外,值得一提的是,为什么这是必要的,因为没有任何事实上真正等于或不等于NULL,包括另一个null:

http://en.m.wikipedia.org/wiki/Three-valued_logic

答案 3 :(得分:0)

UPDATE table SET A=9,B=7,C="mouse" WHERE B IS NULL OR C IS NULL