2012-10-19 38 views
0

我有一个表,其中列field_value有以下可能的值。MySQL:为什么在MySQL中忽略NULL?

但是,当我尝试选择所有不是'CB'的值时,查询结果也会忽略所有NULL值。

为什么会发生这种情况?

mysql> select distinct field_value from TableName; 
+--------------+ 
| field_value | 
+--------------+ 
| S   | 
| NULL   | 
| CA   | 
| CB   | 
+--------------+ 
4 rows in set (6.32 sec) 

mysql> select distinct field_value from TableName where field_value!='CB'; 
+--------------+ 
| field_value | 
+--------------+ 
| S   | 
| CA   | 
+--------------+ 
2 rows in set (0.15 sec) 

mysql> 
+0

您不能使用比较运算符将字段值与NULL进行比较,而必须使用IS NULL运算符。 – Satya

+0

http://stackoverflow.com/search?q=mysql+null – Sumo

回答

2

这是因为与NULL任何比较也产生NULL(即不truthy也不falsy)。

特殊运算符IS NULLIS NOT NULL用于对NULL进行有用的比较。因此

您的查询应该是:

... WHERE field_value!='CB' OR field_value IS NULL; 

参见:Working with NULL values

2

因为NULL是未知的,unknown并不意味着是不是等于CB

如果你想返回空值添加一个条件

IS NULL)在您的查询,

SELECT ... 
FROM ... 
where field_value != 'CB' OR field_value IS NULL 
1

NULL不等于任何值。 NULL不等于任何值。 NULL甚至不等于NULL。如果你不相信,试试吧。

select * from anytable 
where NULL = NULL 
or not NULL = NULL 
or NULL != NULL 
or not NULL != NULL 

您应该得到零行检索。所有四个条件的结果都是UNKNOWN。 未知与TRUE不同。 未知与FALSE不同。如果这听起来像是一团糟,那么你可能已经开始明白了。

最好避免在WHERE条件中使用可为空的列,除非您准备非常仔细地考虑事情。