为什么SELECT'A'WHER @val IN(1,2,3,NULL)在@val IS NULL时不返回值?

时间:2017-03-17 12:06:06

标签: sql-server tsql

实际上以下任何一项都不会返回值。为什么呢?

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)

感谢。

3 个答案:

答案 0 :(得分:3)

想象一下,在房间里有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(未知)时,你无法比较它。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

NULL的比较总是返回未定义的值。即使这个SQL也不会返回任何选择1,其中null = null 它表明NULL是未定义的。