【问题标题】:<> operator in SQLSQL 中的 <> 运算符
【发布时间】:2012-07-04 12:24:55
【问题描述】:

我有一张这样的桌子

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 &lt;&gt; 1 不是 SQL 中的真实语句吗??

IsDeletedbit 类型字段,带有 Allow Null true

【问题讨论】:

  • NULL 表示“无值”,并且在与布尔比较一起使用时始终需要特殊处理。它不会包含在您的&lt;&gt; not-equal 中,除非您还检查了IS NULL
  • 只是强调:这不仅适用于 ,而且适用于所有其他运算符 - 、=、in、between、>、
  • @FrankSchmitt,除了IS NULLIS NOT NULL 之外的所有操作员,当然... ;)
  • @Lucero Argl,忘了这些。你是对的,当然:-)

标签: sql sql-server-2012


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    null 比较总是会得到unknown。这就是为什么您需要使用is 运算符来比较null 或使用COALESCEisnull 之类的函数来替换null

    【讨论】:

      【解决方案3】:
      select  * 
      from tableName 
      where isnull(IsDeleted,0) <> 1
      

      【讨论】:

        【解决方案4】:

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

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

        WHERE IsDeleted <> 1 OR IsDeleted is null
        

        【讨论】:

          【解决方案5】:

          了解 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 NULLIS NOT NULL 的条件。

          【讨论】:

            【解决方案6】:

            通常的做法是,如果您的列本质上是真假,是的,没有类型的字段,那么您应该使用默认值设置为 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-11-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多