当使用NOT IN进行过滤时, 比如NOT IN xxx 时, 如果 xxx 中有NULL值时, 就会一行也不返回 !
在 SQL 中,NOT IN 子查询遇到 NULL 值时会产生意外行为,主要因为 SQL 使用三值逻辑(TRUE、FALSE、UNKNOWN),而不是二值逻辑. SQL 比较(如 =, IN)涉及 NULL 时,结果可能是 UNKNOWN(未知)。 而WHERE 子句只接受 TRUE 的行;UNKNOWN 或 FALSE 的行会被排除。
NOT IN 的内部逻辑:x NOT IN (a, b, NULL) 等价于 x != a AND x != b AND x != NULL。 如果 x != NULL 为 UNKNOWN,整个表达式为 UNKNOWN,导致行被排除。
所以一定要用 NOT EXISTS 替代 NOT IN:最稳健,避免 NULL 问题。
本文作者:JiangOil
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!