1

我正在使用 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”之外的所有值?

谢谢!!

4

3 回答 3

3

请参阅SQL 中 NULL 的行为

涉及 NULL 的两个值之间的布尔比较既不返回 true 也不返回 false,但在 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');
于 2012-08-21T16:00:19.880 回答
3

正如其他人所提到的,与一个或多个NULL操作数的比较会导致NULL. 您可以改为使用 MySQL 的NULL-safe 相等运算符, <=>

SELECT col_1 FROM table1 WHERE id = 1 AND NOT col_1 <=> "x"
于 2012-08-21T16:07:57.663 回答
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);
于 2012-08-21T16:00:47.880 回答