SQL 的 != 运算符和 NULL 难题
SQL 的 !=
(不等于)运算符在处理 NULL
值时提出了独特的挑战。 虽然它可以有效地比较非 NULL 值,但它与 NULL
的行为是违反直觉的。
!= NULL
考虑这个:
<code class="language-sql">SELECT * FROM MyTable WHERE MyColumn != NULL; -- Returns 0 rows SELECT * FROM MyTable WHERE MyColumn NULL; -- Also returns 0 rows</code>
这些查询旨在查找 MyColumn
是 不是 NULL
的行,令人惊讶的是返回空结果集。这不是一个错误;而是一个错误。这是由于NULL
的本质。 NULL
不代表值;它代表值的缺失。 因此,使用 NULL
或 !=
将值与 =
进行比较始终会产生 UNKNOWN
,而不是 TRUE
或 FALSE
。
解决方案:IS NOT NULL
要准确识别非 NULL 值,请使用 IS NOT NULL
谓词:
<code class="language-sql">SELECT * FROM MyTable WHERE MyColumn IS NOT NULL; -- Returns the expected rows</code>
IS NOT NULL
(及其对应的 IS NULL
)专为处理 SQL 比较中的 NULL
值而设计。
与非 NULL 值比较
与非 NULL 值进行比较时,!=
运算符按预期运行:
<code class="language-sql">SELECT * FROM MyTable WHERE MyColumn != 'ValueX'; -- Returns rows where MyColumn is not 'ValueX'</code>
要点
涉及NULL
值的精确SQL查询需要使用IS NOT NULL
和IS NULL
。 避免使用 !=
或 =
进行 NULL
比较,以防止出现意外结果。 使用这些专用谓词可以可靠地处理 SQL 语句中的 NULL
。
以上是为什么 != 在 SQL 中与 NULL 比较时失败?的详细内容。更多信息请关注PHP中文网其他相关文章!