49

我在 MySQL 表中有一个名为 CODE 的列,它可以为 NULL。假设我有一些 CODE='C' 的行,我想在我的选择结果集中忽略这些行。我的结果集中可以有 CODE=NULL 或 CODE!='C'。

以下查询不返回 CODE 为 NULL 的行:

SELECT * from TABLE where CODE!='C'

但是这个查询按预期工作,我知道这是正确的方法。

SELECT * from TABLE where CODE IS NULL OR CODE!='C'

我的问题是为什么只有 CODE!='C' 不会返回 CODE=NULL 的行?绝对 'C' 不为 NULL。我们在这里没有将任何价值与角色进行比较。有人可以解释一下为什么它不能那样工作吗?

4

7 回答 7

59

在 MySQL 中,NULL被认为是“缺失的未知值”,而不是没有值。看看这个 MySQL Reference on NULL

任何算术比较NULL都不会返回 true 或 false,而是返回NULL。因此,NULL != 'C'返回NULL,而不是返回 true。

任何与 'NULL' 的算术比较都将返回 false。要在 SQL 中检查这一点:

SELECT IF(NULL=123,'true','false') 

要检查NULL值,我们需要使用IS NULL&IS NOT NULL运算符。

于 2012-03-07T20:37:26.503 回答
54

根据我的测试和这里的文档:http: //dev.mysql.com/doc/refman/5.0/en/comparison-operators.html

您可以使用 <=> 比较 null 并获得布尔结果
注意:它看起来像 NOT EQ 运算符,但它是 EQ 运算符

例如:

select x <=> y; 
or
select @x <=> @y;

这也比较了字符串与空值、字符串与字符串等。

于 2013-10-22T21:53:37.910 回答
17

在 SQL 中,NULL 值是一个特殊值,不能与任何其他值进行比较。与 NULL 直接比较的结果始终为 NULL,尽管(不幸的是)在某些实现中您可能会发现 FALSE。

要测试空值,您应该使用IS NULLand IS NOT NULL

于 2012-03-07T20:39:21.713 回答
6
SELECT * 
FROM `table_name` 
WHERE IFNULL(`column_name` != 'C', TRUE)
于 2012-10-01T07:38:50.417 回答
2
select * from user where application_id='1223333344' and name is null;
于 2017-01-17T09:17:01.880 回答
2

指定的问题也可能出现在连接中,上述答案并不是特别有用。我更喜欢这样做的方式是合并其他不可能的价值。例如,这个

   select foo from bar
     inner join baz on bar.x = baz.y

如果bar.xbaz.y都是空值则不起作用(加入不会带来结果)。解决方法是使用例如

   select foo from bar
     inner join baz on coalesce(bar.x, -1) = coalesce(baz.y, -1)

其中-1“不可能”值意味着它永远不会出现在数据集中。

于 2020-06-08T11:13:47.583 回答
1

我用:

SELECT * from TABLE where NOT(CODE <=> 'C')
于 2022-01-17T01:54:22.090 回答