SQL Server-集合中的值为Null

SQL Server-集合中的值为Null,sql,sql-server-2008,Sql,Sql Server 2008,有人能解释为什么吗 SELECT bl_id FROM bl WHERE bl_id NOT IN (SELECT bl_id FROM eq WHERE bl_id IS NOT NULL) 返回1483行。 但是, 返回0行 我意识到这与“从eq中选择bl_id”可以返回一个可以为空的bl_id这一事实有关 但我不明白的是,即使其中一个bl_id值为null,外部WHERE子句也不会返回true。为什么? 这就是不在中的工作方式。我强烈建

有人能解释为什么吗

 SELECT bl_id
  FROM bl
 WHERE bl_id NOT IN (SELECT bl_id FROM eq
                      WHERE bl_id IS NOT NULL)
返回1483行。 但是,

返回0行

我意识到这与“从eq中选择bl_id”可以返回一个可以为空的bl_id这一事实有关


但我不明白的是,即使其中一个bl_id值为null,外部WHERE子句也不会返回true。为什么?

这就是
不在
中的工作方式。我强烈建议您学习使用
不存在

SELECT bl_id
FROM bl
WHERE NOT EXISTS (SELECT 1
                  FROM eq
                  WHERE eq.bl_id = bl.bl_id
                 );
这具有您所期望的语义

原因是因为
NULL
在SQL中表示“未知”。它不是一个特定的值。因此,如果您有这些:

where 1 not in (1, 2, 3)
where 1 not in (2, 3)
然后SQL可以将第一个值计算为“false”,第二个值计算为“true”。但是,如果您有:

where 1 not in (1, 2, 3, NULL)
where 1 not in (2, 3, NULL)

那么第一个是“false”,因为“1”在集合中。第二个是
NULL
,因为我们不知道
NULL
可能是什么值,它可能是
1
。因此,子集中带有
NULL
值的
NOT IN
总是返回“false”或
NULL
,并且这两种可能性都不是真的。

这就是
NOT IN
的工作原理。我强烈建议您学习使用
不存在

SELECT bl_id
FROM bl
WHERE NOT EXISTS (SELECT 1
                  FROM eq
                  WHERE eq.bl_id = bl.bl_id
                 );
这具有您所期望的语义

原因是因为
NULL
在SQL中表示“未知”。它不是一个特定的值。因此,如果您有这些:

where 1 not in (1, 2, 3)
where 1 not in (2, 3)
然后SQL可以将第一个值计算为“false”,第二个值计算为“true”。但是,如果您有:

where 1 not in (1, 2, 3, NULL)
where 1 not in (2, 3, NULL)
那么第一个是“false”,因为“1”在集合中。第二个是
NULL
,因为我们不知道
NULL
可能是什么值,它可能是
1
。因此,如果子集中的值为
NULL
,则
NOT IN
始终返回“false”或
NULL
,并且这两种可能性都不是真的