我在SQL Server 2012数据库中的一个表上有一个位列。
我正在尝试检索此位列为NULL
或非TRUE的所有行。
此查询没有返回它应该返回的内容:(返回0行)
Select *
from table
where bit_column_value <> 1
此查询返回正确的行:
Select *
from table
where bit_column_value IS NULL
现在,我很乐意使用第二个查询,但我的问题是,在另一个表的类似查询中,上面的相反情况是正确的,其中第一种方法有效,但第二种方法无效!
有没有人能帮我解释一下上面的区别?我特别将相关的位列更新为NULL,这不会改变结果。(我认为"Empty“和Null
值之间可能存在差异。
提前感谢您的解释。
发布于 2013-02-05 14:37:54
<>
不工作的原因是SQL将NULL
视为未知-它不知道NULL
应该是什么意思,因此它将NULL
值上的=
和<>
都计算为UNKNOWN
(在where子句或连接条件中被视为false )。更多信息,请阅读:Why does NULL = NULL evaluate to false in SQL server。
如果存在索引,则使用ISNULL函数将意味着不能使用该索引,因此为了确保查询可以使用该索引,只需使用OR
SELECT *
FROM TableName
WHERE
bit_column_value IS NULL OR bit_column_value = 0
发布于 2013-02-05 14:21:56
最好的方法是这样编写查询:
SELECT
*
FROM
table
WHERE
ISNULL(bit_column_value, 0) = 0
这应该会返回所有的NULL和FALSE记录。
如果没有看到您的表结构和数据,我无法真正评论为什么您的两个查询会得到不同的结果。
https://stackoverflow.com/questions/14701314
复制相似问题