我确定我无法理解(并且可能会接受(这一点,但是有人可以给我的感觉带来安慰吗?
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 时,TRUE
value 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",因此接受它,并插入该行。