我有一张这样的表
ID Name IsDeleted
1 Yogesh Null
2 Goldy 1
现在我运行此查询
select *
from tableName
where IsDeleted <> 1
我应该得到ID 1
记录,但我没有得到它,
但是当我运行这个
时select *
from tableName
where IsDeleted is null
我得到ID 1
条记录,
为什么我要面对这种行为?
不是NULL <> 1
是SQL中的真实语句吗?
IsDeleted
是bit
类型字段Allow Null true
答案 0 :(得分:4)
select * from table
where COALESCE(IsDeleted, 0) <> 1
-- or ISNULL instead of COALESCE.
--ISNULL seems to be better in subqueries, but it's not ANSI SQL.
或
select * from table
where IsDeleted <> 1 or IsDeleted IS NULL
答案 1 :(得分:1)
将某些内容与null
进行比较将始终生成unknown
。这就是为什么您需要使用is
运算符来比较null
或使用COALESCE
或isnull
等函数来替换null
答案 2 :(得分:1)
select *
from tableName
where isnull(IsDeleted,0) <> 1
答案 3 :(得分:1)
你比较不同的类型。在这种情况下,它是另一种类型(未知)而不具有可比性
使用or语句来比较每种类型的单独
WHERE IsDeleted <> 1 OR IsDeleted is null
答案 4 :(得分:1)
了解NULL - 与NULL的比较(在标准SQL中)产生UNKNOWN,这不是真的也不是假的(以及为什么不满足你的期望的原因)。
试试这个:
PRINT CASE
WHEN 1 = NULL THEN '1 = NULL'
WHEN 1 <> NULL THEN '1 <> NULL'
ELSE '1 is neither = NULL nor <> NULL'
END
您可以先确保没有NULL值(例如使用ISNULL
或COALESCE
函数),或使用运算符IS NULL
的条件或IS NOT NULL
。
答案 5 :(得分:1)
正常练习会指示如果你的列基本上是一个真正的假,是没有类型的字段,那么你应该使用一个默认值设置为0的位字段。
所以在你的情况下你可以运行这个:
select *
from tableName
where IsDeleted = 0
但是在回答上面的问题时,如果Null是表中的真值NULL,那么这对你有用:
select *
from tableName
where IsDeleted is null
或
select *
from tableName
where isnull(IsDeleted,0) = 0
获取记录1和
select *
from tableName
where IsDeleted is not null
获得记录2
祝你好运保罗。