它一定很简单,但是我在这个上面撞到了屋顶。
我有一张桌子
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"
任何帮助都将不胜感激。
答案 0 :(得分:3)
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:
答案 3 :(得分:0)
UPDATE table SET A=9,B=7,C="mouse" WHERE B IS NULL OR C IS NULL