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
,并且这两种可能性都不是真的