为啥当@val IS NULL 时SELECT 'A' WHERE @val IN (1, 2, 3, NULL) 不返回值? [复制]

Posted

技术标签:

【中文标题】为啥当@val IS NULL 时SELECT \'A\' WHERE @val IN (1, 2, 3, NULL) 不返回值? [复制]【英文标题】:Why SELECT 'A' WHERE @val IN (1, 2, 3, NULL) does not return a value when @val IS NULL? [duplicate]为什么当@val IS NULL 时SELECT 'A' WHERE @val IN (1, 2, 3, NULL) 不返回值? [复制] 【发布时间】:2017-03-17 12:06:06 【问题描述】:

事实上,以下都没有返回值。为什么?

DECLARE @val AS INTEGER
SET @val= NULL
SELECT 'A' WHERE @val  IN (1, 2, 3, NULL)
SELECT 'B' WHERE @val NOT IN (1, 2, 3, NULL)
SELECT 'C' WHERE @val IN (1, 2, 3)
SELECT 'D' WHERE @val NOT IN (1, 2, 3)

谢谢。

【问题讨论】:

没有什么是等于未知的,即使是NULL 本身 Chuck noriss 将 null 与 null 进行比较,结果为真……还是 Jon Skeet? :-) 无法使用运算符比较 Null,为此您必须使用 IS NULL 或 IS NOT NULL。但是,如果您仍想使用操作,则可以尝试类似 ISNULL(@val,-1) IN (1, 2, 3, -1) 的操作,在其中将 null 替换为一些未使用的虚拟值并检查 【参考方案1】:

想象房间里有 5 个女人。你认识其中 3 个:Lisa、Sandra 和另一个 Lisa,其中 2 个是陌生人,所以你不知道他们的名字。

如果有人问你这些陌生人是否有相同的名字,你无法回答,因为你不知道,所以在这种情况下你没有返回任何行:

DECLARE @val AS NVARCHAR(20)
SET @val = NULL

DECLARE @Women AS TABLE
(
    Id INT,
    Name NVARCHAR(20)
)
INSERT INTO @Women VALUES (1,'Lisa'), (2,'Sandra'), (3,'Lisa'), (4,NULL), (5,NULL)

SELECT *
FROM @Women
WHERE @val IN (Name)

此外,如果有人问你陌生人的名字是否不相等,你也无法回答,因此不会返回任何行。

SELECT *
FROM @Women
WHERE @val NOT IN (Name)

因此,当您有 NULL(未知)时,您无法比较它。

【讨论】:

【参考方案2】:

除非您使用 Is Null 或 Is Not Null,否则与 NULL 的比较总是返回 false。你应该把它改成这样:

SELECT 'A' WHERE @val IN (1, 2, 3) OR @val Is Null

【讨论】:

【参考方案3】:

NULL 的比较总是返回未定义的值。即使这个 SQL 也不会返回任何东西 select 1 where null = null 它表明 NULL 只是未定义。

【讨论】:

以上是关于为啥当@val IS NULL 时SELECT 'A' WHERE @val IN (1, 2, 3, NULL) 不返回值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 is 运算符在给定 null 时返回 false?

为啥当代码有效时 JQuery .val() 方法有时会返回 undefined? [复制]

为啥当 cv=5 时 cross_val_predict 只返回单个预测数组

为啥 jquery select.val() 在 AngularJS 环境中返回类型:值?

为啥这个 SQL 查询失败

bootstrap-select 插件多选下拉框提交时为啥还是只提交一个值?