如何保护sql语句免受Divide By Zero错误

时间:2014-04-22 20:57:07

标签: sql-server tsql sql-server-2012

我正在创建一些报告,这些报告需要一个有限的总计(比方说2,500)产品(例如冰淇淋甜筒),并计算在服务之前它们中有多少被破坏了。

现在,我已经失败了实际的破碎锥体计数代码。

SELECT COUNT(broken_cones) FROM [ice].[ice_cream_inventory] 
WHERE broken_cones = 'Yes'

但是,我需要一定比例的破碎锥体。我一直在玩这个代码,但我一直在遇到“零除零”的问题。以下代码出错。

SELECT CAST(NULLIF((.01 * 2500)/Count(broken_cones), 0) AS 
decimal(7,4)) FROM [ice].[ice_cream_inventory] WHERE broken_cones = 'Yes'

目前,没有任何破碎的锥体(并且暂时不会),所以现在总数为零。如何将NULL场景显示为零?

我试图在混合中添加一个ISNULL语句,但我不断得到'除以零'错误。我甚至这样做了吗?

::编辑::

这是我最终的结果。

SELECT 
CASE
WHEN COUNT(broken_cones) = 0 then 0
ELSE CAST(NULLIF((.01 * 2500)/Count(broken_cones), 0) AS decimal(7,4))
END
FROM [ice].[ice_cream_inventory] WHERE broken_cones = 'Yes'

3 个答案:

答案 0 :(得分:12)

使用案例陈述。

SELECT 
CASE WHEN COUNT(broken_cones) = 0 then 0
ELSE CAST(NULLIF((.01 * 2500)/Count(broken_cones), 0) AS decimal(7,4)) END
FROM [ice].[ice_cream_inventory] WHERE broken_cones = 'Yes'

答案 1 :(得分:4)

您已经有了解决方案,但这就是原始解决方案不起作用的原因。

您的NULLIF需要移动才能生效。它在进入NULLIF调用之前正在进行除法。除以null将返回空值。

SELECT CAST((.01 * 2500)/NULLIF(Count(broken_cones), 0) AS decimal(7,4)) 
FROM [ice].[ice_cream_inventory] 
WHERE broken_cones = 'Yes'`

答案 2 :(得分:1)

NULLIF()函数是防止除以零的好方法,因为任何除以NULL的值都会返回null。使用它的方法如下:

<expression> / NULLIF( <expression>, 0 )

不幸的是,你已经将整个除法表达式包裹在NULLIF()中,这就是为什么它不适合你。因此,如果您的NULL返回零,则第一步是让它返回COUNT()

SELECT
    (0.01 * 2500) / NULLIF( COUNT(broken_cones), 0 )
FROM [ice].[ice_cream_inventory]
WHERE broken_cones = 'Yes'

现在你说你想让NULL回零吗?这是您使用ISNULL()

的地方
ISNULL(<expression1>, <expression2>)

如果第一个表达式为NULL,则返回第二个表达式,因此我们的SQL现在变为:

SELECT 
    ISNULL(
        (0.01 * 2500) / NULLIF( COUNT(broken_cones), 0 ),
        0
    )
FROM [ice].[ice_cream_inventory]
WHERE broken_cones = 'Yes'