以下两者有何区别:
where x is null
与
where x = null
为什么后者不起作用?
以下两者有何区别:
where x is null
与
where x = null
为什么后者不起作用?
=
、!=
、<
等)将null
值与任何其他值(包括另一个null
)进行比较,结果为null
,这被认为是where子句的false
(严格来说,它是“不是真实的”,而不是“false”,但效果相同)。null
意味着“未知”,因此与null
进行任何比较的结果也是“未知”。因此,通过编码where my_column = null
将不能对行进行命中。null
的特殊语法,即is null
和is not null
,这是一种特殊条件,用于测试null
(或非null
)。create table t (x int, y int);
insert into t values (null, null), (null, 1), (1, 1);
select 'x = null' as test , x, y from t where x = null
union all
select 'x != null', x, y from t where x != null
union all
select 'not (x = null)', x, y from t where not (x = null)
union all
select 'x = y', x, y from t where x = y
union all
select 'not (x = y)', x, y from t where not (x = y);
只返回1行(预期):
TEST X Y
x = y 1 1
点击此处查看在 SQLFiddle 上的运行结果。
NULL = NULL
不是 true
,我们可以得出结论:在 =
运算符的两侧,null
的语义含义是不同的。在左侧,它是一个概念;在右侧,它是一个谓词(即“未知”与“是未知的”)。这些本质上是不相等的。▮ - Mardoxx需要注意的是,NULL并不等于NULL。
NULL
不是一个值,因此无法与另一个值进行比较。
where x is null
检查x是否为空值。
where x = null
检查x是否等于NULL,这将永远不会成立。
null
赋给了变量 a
。但对于程序员来说,这个解释就像是在说:“这个变量没有值”。此外,在 SQL 中,null 可以有多种解释或三值逻辑。 - broadband首先,正确的方法是检查一个字段值是否为null
,而后一种方法不会按照你的期望工作,因为null
是一种特殊的值,它不等于任何东西,所以你不能使用等号=
进行相等比较。
因此,当您需要检查一个字段值是否为null
时,请使用:
where x is null
使用以下代替:
where x = null
我认为平等是可以被绝对确定的。 null
的问题在于它本质上是未知的。将 null
与任何其他值组合在一起都会得到 null
- 未知。即使输入是 null
,每次询问 SQL “我的值是否等于 null
?” 都将得到未知的答案。我认为实现 IS NULL
可以让这一点更加清晰。