可用版本:Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11

SQL: NOT IN 谓词

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

NOT IN 谓词看起来像是有效的 IN 谓词 的反向操作,但在 SQL 中,由于 SQL 的 三值逻辑,这并不完全正确。

看看等价谓词的以下转换

-- 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,则结果为 TRUEUNKNOWN,后者在查询中的行为类似于 FALSE。我们没问题。
  • 如果合取 (AND) 的一个值为 UNKNOWN,则结果为 FALSEUNKNOWN,因此谓词始终表现得好像它是 FALSE。 这绝对不是我们想要的!

更糟糕的是,如果您使用 NOT IN (子查询),则此问题可能只是偶尔发生,当子查询返回单个 NULL 值时。 这是符合逻辑的,但从没有用处。 所以最好只使用 NOT EXISTS 谓词 代替。

另请参阅 这篇博文,其中讨论了跨方言的兼容性

反馈

您对此页面有任何反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo