sql - 奇怪的 SQL 行为,我想知道为什么会这样

标签 sql sql-server-2005 tsql

考虑以下 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 NULLIS 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/

相关文章:

sql - 存储过程逻辑错误

mysql - 使用 GROUP BY 对总记录编写 SQL 查询

SQL Server 探查器不显示 LINQ To Sql 查询

python - 使用 PyODBC 将参数传递给存储过程

c# - 如何在 C# 中以编程方式创建 SQL Server 数据库

sql主键和索引

sql-server - 使用 XML 输入的 SQL SELECT

mysql - 选择不同值 SQL

mysql - 难以设计具有双向可选的数据库 1 :1 relationship

mysql - 使用 mysql 查找具有 2 个关联(一起)的项目