查询条件的 NULL 值

NULL Values on query condition

我正在尝试使用 not in 和 exists 比较空值,但我发现了一些差异 为什么最新查询returns为null?它与数据库参数有关吗?

--SET ANSI_NULLS On

CREATE TABLE #Tmp (id INT)
CREATE TABLE #Tmp1 (id INT)

INSERT INTO #Tmp(id) VALUES (1)
INSERT INTO #Tmp(id) VALUES (null)


INSERT INTO #Tmp1(id) VALUES (1)
INSERT INTO #Tmp1(id) VALUES (null)

SELECT id FROM #Tmp WHERE id IN (SELECT id FROM #tmp1)

SELECT id FROM #Tmp WHERE EXISTS(SELECT 1 FROM #Tmp1 WHERE #Tmp1.id = #Tmp.id)

SELECT id FROM #Tmp WHERE id NOT IN (SELECT id FROM #tmp1)

SELECT id FROM #Tmp WHERE NOT EXISTS(SELECT 1 FROM #Tmp1 WHERE #Tmp1.id = #Tmp.id)

DROP TABLE #Tmp
DROP TABLE #Tmp1 

很简单:

id IN (1, NULL)
<=>
id = 1 OR id = NULL

negation of alternative

id NOT IN (1, NULL)
<=>
id != 1 AND id != NULL -- yields NULL

总结:

如果您想使用 NOT IN,请确保您的列表不包含 NULL

SELECT id FROM #Tmp WHERE id NOT IN (SELECT id FROM #tmp1 WHERE id IS NOT NULL)

SELECT id FROM #Tmp WHERE id NOT IN (SELECT COALESCE(id,-1) FROM #tmp1)

在 SQL 服务器中,请记住 NULL 不会 return 与任何东西进行 TRUE 的相等性检查(除非你正在玩 ANSI_NULLS):

SELECT 1 
WHERE 1=NULL

SELECT 1
WHERE NULL = NULL

当您使用 IS/IS NOT

时,它只有 return 是正确的
SELECT 1
WHERE NULL IS NULL

对于您的最后一个查询,满足 WHERE 子句中该要求的唯一记录是您的 NULL 行。等价于:

SELECT id FROM #Tmp 
WHERE id IS NULL

要解决您的问题,请在此处添加第二个子句:

SELECT id FROM #Tmp 
WHERE NOT EXISTS(
SELECT 1 
FROM #Tmp1 
WHERE #Tmp1.id = #Tmp.id OR #Tmp.id IS NULL
)