我在SQL Server 2012数据库的表上有一点列。
我正在尝试检索此位列为NULLtrue或NOT TRUE的所有行。
NULL
该查询不带回它应该返回的内容:(返回0行)
Select * from table where bit_column_value <> 1
此查询带回正确的行:
Select * from table where bit_column_value IS NULL
现在,我很乐意使用第二个查询,但是我的问题是,在对另一个表进行类似的查询中,上述相反的做法是正确的,其中第一种方法可行,但第二种方法无效!
有人可以帮忙解释一下上面的区别吗?我已将相关的位列专门更新为NULL,这不会更改结果。(认为“空”和Null值之间可能存在差异。
Null
预先感谢您的任何解释。
之所以<>不起作用是SQL对待NULL未知- 它不知道什么NULL是应该的意思,所以它会评估=,并<>在NULL值UNKNOWN(在where子句或连接条件视为假)。有关更多信息,请阅读:SQL Server中为什么NULL = NULL评估为false。
<>
=
UNKNOWN
如果上面有一个索引,则使用ISNULL函数将意味着该索引无法使用,因此要确保查询可以使用该索引,只需使用OR:
OR
SELECT * FROM TableName WHERE bit_column_value IS NULL OR bit_column_value = 0