<> SQL中的运算符

时间:2012-07-04 12:24:56

标签: sql sql-server-2012

我有一张这样的表

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中的真实语句吗?

IsDeletedbit类型字段Allow Null true

6 个答案:

答案 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或使用COALESCEisnull等函数来替换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值(例如使用ISNULLCOALESCE函数),或使用运算符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

祝你好运

保罗。