【问题标题】:ISNULL erroneous return?ISNULL 错误返回?
【发布时间】:2015-05-11 19:46:34
【问题描述】:

我有以下疑问:

SELECT apps.Field4,
       ISNULL(apps.field4, '-1')
FROM   applications apps
WHERE  apps.OBJECT_ID = 1727847
       AND ISNULL(apps.Field4, -1) = -1 

apps.field4 是一个整数,对于field4,没有记录的值小于 0。

上述查询的返回值为:

+------+----+
| NULL | -1 |
+------+----+

但如果我在 where 子句中添加AND apps.field4 is NULL,则不会返回任何记录:

SELECT apps.Field4,
       ISNULL(apps.field4, '-1')
FROM   applications apps
WHERE  apps.OBJECT_ID = 1727847
       AND apps.field4 IS NULL
       AND ISNULL(apps.Field4, -1) = -1 

为什么ISNULL 似乎可以正确识别NULL 值,而IS NULL 却不能?

【问题讨论】:

  • 为什么在 WHERE 子句中有“and ISNULL(apps.Field4, -1) = -1”? -1 是合法的列值,所以您不想只说“WHERE (apps.Field4 IS NULL or apps.Field4 = -1)”?
  • 检查是否有损坏。
  • 两者似乎都适用于fiddle。您确定传入此 SQL 没有问题吗?还是直接通过 SSMS 执行?
  • @Ghost - DBCC CHECK... 命令 - 修复取决于问题。如果它在非聚集索引中,则删除和重新创建将起作用。
  • @pmbAustin 但我的代码显示“apps.Field4 IS NULL”不会导致返回任何记录。第一个查询证明 object_id = 1727847 的记录实际上在 Field4 列中有一个 NULL 值:)

标签: sql-server isnull


【解决方案1】:

我知道我没有回答你的问题。但是,我在 MSDN 中发现了一些有趣的东西:

C.在 WHERE 子句中测试 NULL 不要使用ISNULL 来查找NULL 值。请改用IS NULL。以下示例查找重量列中包含 NULL 的所有产品。注意ISNULL 之间的空格。

USE AdventureWorks2012;
GO
SELECT Name, Weight
FROM Production.Product
WHERE Weight IS NULL;
GO

https://msdn.microsoft.com/en-us/library/ms184325.aspx

【讨论】:

  • ISNULL 正在使用,因为我希望将 NULL 值和 -1 值视为相同。或者换句话说,它是一个简短的形式,而不是这样做: AND (field4 IS NULL OR field4 = -1)
【解决方案2】:

看起来数据库损坏是问题所在。最后我要么使用 DBCC CHECKDB 要么 DBCC CHECKTABLE 来解决这个问题,问题就消失了。

【讨论】:

    猜你喜欢
    • 2017-07-29
    • 2013-09-09
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多