执行含NULLIF、ISNULL的SQL语句仍遇除零错误,求原因
为什么用了ISNULL还是触发除零错误?
嘿,我来帮你揪出问题的根源!你遇到的Divide by zero error其实不是ISNULL没用,而是你的CASE语句逻辑里藏着一个小错误,导致除法操作在ISNULL生效之前就触发了。
问题出在哪?
看你CASE语句里的这部分:
CASE WHEN ToplamSatis = 0 THEN ISNULL(ToplamStok/NULLIF(ToplamSatis,0.1)*7,0) ELSE (ToplamStok/ToplamSatis)*7 end
这里有两个关键问题:
- NULLIF的参数写错了:
NULLIF(ToplamSatis,0.1)的作用是“当ToplamSatis等于0.1时返回NULL,否则返回ToplamSatis本身”。所以当ToplamSatis=0的时候,这个函数返回的还是0,你依然在执行ToplamStok/0的操作,自然触发除零错误。 - ISNULL生效时机太晚:ISNULL是在除法运算之后才判断结果是否为NULL,但除法已经执行了,错误早就在这一步发生了,ISNULL根本没机会发挥作用。
正确的写法应该是怎样的?
我们要确保在ToplamSatis=0的时候完全跳过除法操作,或者用NULLIF把0转换成NULL,再用ISNULL处理结果。比如两种常见的正确写法:
写法1:直接在ToplamSatis=0时返回0
CASE WHEN ToplamSatis = 0 THEN 0 ELSE (ToplamStok / NULLIF(ToplamSatis, 0)) * 7 END as SDH
这个逻辑最直接:当销量为0时,SDH直接设为0,避免任何除法操作。
写法2:用NULLIF处理除数,再用ISNULL兜底
ISNULL((ToplamStok / NULLIF(ToplamSatis, 0)) * 7, 0) as SDH
这里NULLIF(ToplamSatis,0)会把ToplamSatis为0的情况转换成NULL,此时ToplamStok/NULL的结果是NULL,最后用ISNULL把NULL转换成0,全程不会触发除零错误。
这样修改后,你的SQL语句就不会再出现除零错误啦!
内容的提问来源于stack exchange,提问作者garbage00
相关产品推荐
相关产品推荐

