查询条件的 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
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
)
我正在尝试使用 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
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
)