我在 where 子句中有以下语句
COLUMN_1 <> 'O'
但是 NULL
上包含 COLUMN_1
的行不会被考虑在内,就好像它们包含值 'O'
。
这是为什么?
因为
NULL
不等于,not也不等于任何东西,包括NULL
。 NULL <> 'O'
评估为未知;这显然是不正确的。
如果您想使用
NULL
值进行评估,您需要使用 IS NULL
:
WHERE (COLUMN_1 <> 'O' OR COLUMN_1 IS NULL)
这也记录在两篇不等于运算符文章中:
不等于 (Transact SQL) - 传统
比较两个表达式(比较运算符)。比较非空表达式时,如果左操作数不等于右操作数,则结果为 TRUE;否则,结果为 TRUE。否则,结果为 FALSE。如果其中一个或两个操作数均为 NULL,请参阅主题 SET ANSI_NULLS (Transact-SQL)。
不等于 (Transact SQL) - 感叹号
测试一个表达式是否不等于另一个表达式(比较运算符)。如果其中一个或两个操作数均为 NULL,则返回 NULL。功能与 <>(不等于) 比较运算符相同。