我正在使用MySQL社区版5.1。这是一个奇怪的问题。我有一个表格,其中某个列值为null
。让我们说我们有
table1
是
| col_1 | id |
null 1
当我这样做时:
select col_1 from table1 where id = 1
我得到了这个 - >
| col_1 |
null
但是当我这样做时:
select col_1 from table1 where id = 1 and col_1 != "x";
查询不会返回任何结果。
我希望此处的第二个查询返回与第一个查询相同的内容,因为col_1
的值显然不是" x"。为什么会这样?我可以对第二个查询做什么,以便它以应有的方式工作,即。返回id = 1的行和col_1
的所有值,除了" x"?
谢谢!
答案 0 :(得分:3)
请参阅The Behavior of NULLs in SQL
涉及NULL的两个值之间的布尔比较返回 在SQL的三值逻辑中既不是真也不是假,而是未知的。 [3] 例如,NULL既不等于NULL也不NULL不等于NULL 真正。测试值是否为NULL需要表达式,例如 IS NULL或IS NOT NULL。
因此,您可以将查询更改为:
select col_1
from table1
where id = 1
and (col_1 is null or col_1 != 'x');
答案 1 :(得分:3)
正如其他人所提到的,与一个或多个NULL
个操作数进行比较会产生NULL
。您可以使用MySQL的NULL
-safe equality operator,<=>
:
SELECT col_1 FROM table1 WHERE id = 1 AND NOT col_1 <=> "x"
答案 2 :(得分:1)
在mysql中使用!=将NULL与值进行比较会产生意外结果。这是SQL的一个愚蠢的怪癖(抱歉,我没有更好的答案)NULL对他们来说意味着“没有价值”因此无法进行比较。见http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html
尝试:
select col_1 from table1 where id = 1 and (col_1 != "x" OR col_1 IS NULL);