4

我有一张这样的桌子

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

IsDeleted是一个bit类型字段Allow Null true

4

6 回答 6

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
于 2012-07-04T12:26:52.243 回答
1

将某些东西与 进行比较null总是会导致unknown. 这就是为什么您需要使用is运算符来比较null或使用类似COALESCEisnull替换的功能null

于 2012-07-04T12:28:17.703 回答
1
select  * 
from tableName 
where isnull(IsDeleted,0) <> 1
于 2012-07-04T12:31:14.153 回答
1

你比较不同的类型。在这种情况下,它是另一种类型(未知)且不可比较

使用 or 语句分别比较每种类型

WHERE IsDeleted <> 1 OR IsDeleted is null
于 2012-07-04T12:31:38.420 回答
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 值(例如通过使用ISNULLorCOALESCE函数),或者使用带有运算符IS NULLor的条件IS NOT NULL

于 2012-07-04T12:33:15.830 回答
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

祝你好运

保罗。

于 2012-07-04T12:36:33.450 回答