考虑以下 Transact sql。
DECLARE @table TABLE(val VARCHAR(255) NULL)
INSERT INTO @table (val) VALUES('a')
INSERT INTO @table (val) VALUES('b')
INSERT INTO @table (val) VALUES('c')
INSERT INTO @table (val) VALUES('d')
INSERT INTO @table (val) VALUES(NULL)
select val
from @table
where val not in ('a')
我希望这会回来
b, c, d, NULL
但它返回
b, c, d
为什么会这样? NULL 不计算吗? NULL 以某种方式在集合“a”中?
最佳答案
答案
默认情况下,NULL 对 SQL 表示“未知”。因此,任何与“未知”的比较都是“未知”。
例如,如果一个陌生人站在 Bob 旁边,而您想问这样一个问题:“陌生人的名字和 Bob 的名字一样吗?”。答案是未知的。
由于您问的是“返回值不是'A'的任何记录”。当它到达那个 NULL 列时,SQL 仍然说,“我不知道”。由于表达式的计算结果不为真,因此不会返回该记录。
解决方案
任何将 NULL 与常量进行比较的表达式将始终为 NULL,因此使用特殊的 IS NULL
和 IS NOT NULL
测试 NULL 值。
这会让你b
, c
, d
, 和 NULL
:
SELECT val
FROM @table
WHERE val NOT IN ('a') OR val IS NULL
解决方法
您可以更改 NULL 的默认行为:
SET ANSI_NULLS OFF
关于sql - 奇怪的 SQL 行为,我想知道为什么会这样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2519147/