【问题标题】:Divide by zero error encountered in SQL Server 2014SQL Server 2014 中遇到除以零错误
【发布时间】:2017-01-18 14:56:04
【问题描述】:

在我尝试创建的查询的这个特定部分中,出现“除以零”错误。我相信这是因为我试图将ARTran.Qty 除以一个空值。我不确定如何解决这个问题...(我在查询的下一部分中使用Cast,我正在尝试将此数字用作小数

(CASE WHEN ([ARTran].[UOM] LIKE 'EACH') 
         THEN CAST([ARTran].[Qty] AS VARCHAR(30)) 
      ELSE CAST((ARTran.Qty / InventoryItem.UsrLength) AS VARCHAR(30))
 END)

有人能指出我正确的方向吗?我已经查看了其他几个线程,但我仍然不确定如何解决这个问题。

【问题讨论】:

  • 这种情况下你想做什么?
  • 除以 null 将产生 NULL
  • 如果 UsrLength 为 null 或为零,则需要再检查一次,然后不要进行除法操作。
  • @Matt 帮我解决了问题,感谢您的帮助。
  • 为什么你认为除以零错误是因为你试图除以一个空值?

标签: sql sql-server


【解决方案1】:

使用NULLIF 来解决这个问题。

(CASE WHEN ([ARTran].[UOM] LIKE 'EACH') 
      THEN CAST([ARTran].[Qty] AS VARCHAR(30)) 
      ELSE CAST((ARTran.Qty / NULLIF(InventoryItem.UsrLength, 0) AS VARCHAR(30))
END)

【讨论】:

  • 这里的NULLIF是不是意味着你除以InventoryItem.UsrLength只要不为null,如果为null则除以0?
  • @jarl: 不,恰恰相反——如果它是 0,我们除以 NULL。结果是 NULL 而不是错误——1 / NULL 是合法的,1 / 0不是。
  • @JeroenMostert,我明白了。谢谢你的解释。现在说得通了!
  • 在这个答案中还有其他人看到尝试除以 0 吗?
  • @DanBracuk: NULLIF(x, 0) 永远不会产生0,不管x。它可以产生NULL,但这正是我们想要的。如果你不相信,read the fine manualNULLIF(x, 0) 等价于CASE x WHEN 0 THEN NULL ELSE x END
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
相关资源
最近更新 更多