为什么"NULL is not equal to anything"是虚假陈述?



我确定我无法理解(并且可能会接受(这一点,但是有人可以给我的感觉带来安慰吗?

SELECT IF(NULL != 9, 'TRUE', 'FALSE')

*很抱歉,如果这是一个不合适的地方,但StackOverFlow是我脑海中出现的第一件事。

几乎任何与NULL的比较都返回NULL。 这是因为NULL具有"未知值"而不是"缺失"的语义。

当您有比较9 <> NULL时,返回的值是NULL(用于比较(。

WHERE子句将NULL值视为"false",因此行会被过滤掉。 同样,CASE表达式将NULL值视为"false"。

情况并非总是如此。CHECK约束将NULL值视为"true",因此即使NULL值,检查约束也会通过。

SQL 中的 NULL 表示它没有值。任何值。它不小于、等于或大于任何其他值。

所以:

NULL = 9  => null
NULL < 9  => null
NULL <= 9  => null
NULL > 9  => null
NULL >= 9  => null
NULL != 9  => null
NULL = NULL  => null

当值为 NULL 时,TRUEvalue is NULL

如果您正在处理数据库中的NULL,那么您应该将表达式视为"三位一体逻辑"。也就是说,布尔值的计算结果不再是两个值(如二进制(,而是计算为三个:

  • 没错
  • Null:SQL 标准对其定义不明确,但可能意味着完全没有值,值未知或无法确定。

现在,请注意CHECK约束和WHERE子句在 null 值方面的行为不同。请考虑以下示例:

create table t (
a int check (a <> 5)
);
insert into t (a) values (1), (2), (null);

WHERE 子句

如果谓词(表示条件的表达式(为"true",则WHERE子句接受行;如果谓词的计算结果为 "false" 或 "null",则拒绝该行。

select * from t where a = 1;

结果:

a
-
1

如您所见,"null"已从结果集中排除,因为谓词a = 1计算结果为"null"。

检查约束

CHECK约束的工作方式与WHERE略有不同。当谓词的计算结果仅为"false"时,将被拒绝;当它的计算结果为"true"和"null"时,它被接受。

这就是它插入所有三行的原因,包括"null"值。

select * from t;

结果:

a
----
1
2
null

对于"null"值,谓词a <> 5计算为"null",因此接受它,并插入该行。

相关内容

  • 没有找到相关文章

最新更新