【问题标题】:Trouble comparing smallint in where clause在 where 子句中比较 smallint 时遇到问题
【发布时间】:2011-04-29 16:18:33
【问题描述】:

我有一个表,其中有一列称为 smallint 类型的 status 并接受 null。 Sql server 2000.

我的数据在该字段中主要包含 2,但也包含 0 和 null。

当我这样做时

select *
from table
 where status <> 2

我没有得到所有正确的记录(状态为空或 0)。知道为什么会发生这种情况以及如何纠正吗?不应该给我2以外的所有东西吗?

【问题讨论】:

    标签: sql tsql sql-server-2000


    【解决方案1】:

    NULL 测试不匹配任何算术比较。

    使用

    where status <> 2 OR status is null
    

    【讨论】:

    • 真的吗?所以语句:2 null 是假的?为什么会发生这种情况?
    • 因为 NULL 不是放在字段中的值。它是关于该字段的状态条件,存储在其他位置。
    • 好的,它有效。但从数学的角度来看,它非常令人困惑。 2 和 null(无)不是一回事。
    • @MAW74656 - 甚至SELECT 1 WHERE NULL=NULL 也不返回任何行。
    • 所以null不等于null?奇怪!
    【解决方案2】:
    select *
    from table
     where ISNULL(status, 1) <> 2
    

    NULL doesn't compare: 所以删除它。

    您的示例也是Wikipedia 上的“常见错误”...

    【讨论】:

    • 所以我觉得自己很愚蠢,直到我看到人们抱怨它是如何工作的“批评”部分。不过,不知道我是怎么错过那个条目的……
    • 这个 NULL 的东西只是 。我有更好的抱怨:-)
    【解决方案3】:

    您所期望的可以通过将 ANSI_NULLS 设置为关闭来实现。

    例如,尝试运行以下查询:

    set ansi_nulls off
    select case when 1 != null then 'true' else 'false' end
    
    set ansi_nulls on
    select case when 1 != null then 'true' else 'false' end
    

    话虽如此,这是您期望看到的非常非标准的 SQL 行为。无论是否等于比较,NULL 比较都应该被认为是错误的,因为每个开发人员都会期望这种类型的 SQL 查询行为。

    您的 WHERE 子句应如下所示:

    where status <> 2 or status is null
    

    另一个选项是与 status = 1 进行比较,如果这是您希望包含在查询中的唯一状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      相关资源
      最近更新 更多