为啥当@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) 不返回值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥当代码有效时 JQuery .val() 方法有时会返回 undefined? [复制]
为啥当 cv=5 时 cross_val_predict 只返回单个预测数组