SQL: NOT IN 谓词
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
-- IN predicate is equivalent to: A IN (B, C) A = ANY (B, C) A = B OR A = C -- NOT IN predicate is equivalent to: A NOT IN (B, C) A <> ANY (B, C) A <> B AND A <> C
现在,假设其中一个值是 NULL
,那么,非正式地说
-- IN predicate is equivalent to: A IN (B, NULL) A = ANY (B, NULL) A = B OR A = NULL A = B OR NULL A = B -- NOT IN predicate is equivalent to: A NOT IN (B, NULL) A <> ANY (B, NULL) A <> B AND A <> NULL A <> B AND NULL NULL
将 NULL
视为 UNKNOWN
- 如果析取 (
OR
) 的一个值为UNKNOWN
,则结果为TRUE
或UNKNOWN
,后者在查询中的行为类似于FALSE
。我们没问题。 - 如果合取 (
AND
) 的一个值为UNKNOWN
,则结果为FALSE
或UNKNOWN
,因此谓词始终表现得好像它是FALSE
。 这绝对不是我们想要的!
更糟糕的是,如果您使用 NOT IN (子查询)
,则此问题可能只是偶尔发生,当子查询返回单个 NULL
值时。 这是符合逻辑的,但从没有用处。 所以最好只使用 NOT EXISTS 谓词 代替。
另请参阅 这篇博文,其中讨论了跨方言的兼容性。
反馈
您对此页面有任何反馈吗? 我们很乐意听取您的意见!