嘘~ 正在从服务器偷取页面 . . .

SQLSERVER之不可避免的以零作除数错误


老破烂系统中老板总会给出奇奇怪怪的查询条件
加上控件的限制 不得不使用临时表来进行数据更新

于是乎老板在某次给出的条件数据中

有些数据某些条件下分母必定为零!!Orz

不会SQL的人儿只好开始用自己究极无敌烂的SQL语法来在SQL中添加条件:

原始语句与数据(恩..同事说不用拼音缩写他们看不懂- -):

--更新满足率
UPDATE Tmp
SET Tmp.PJ_DD_MZL = CONVERT(FLOAT,TMP.DD_sftCount)/CONVERT(FLOAT,TMP.Amount),Tmp.DD_XS_MZL = CONVERT(FLOAT,DD_MZXS)/CONVERT(FLOAT,HJSQXS)
FROM #tmp_Pjddmzl AS Tmp

原始数据

最先开始想到的是将0置换为NULL

因为SQL SERVER 中NULL与任何数进行任何运算,其结果都等于NULL

使用NULLIF(expression_1,expression_2)

若expression_1等于expression_2 则返回NULL

否则返回expression_1

UPDATE Tmp
SET Tmp.PJ_DD_MZL = NULLIF(CONVERT(FLOAT,TMP.DD_sftCount),0)/CONVERT(FLOAT,TMP.Amount),Tmp.DD_XS_MZL = NULLIF(CONVERT(FLOAT,DD_MZXS),0)/CONVERT(FLOAT,HJSQXS)
FROM #tmp_Pjddmzl AS Tmp

用了一半发现在这个临时表中不允许NULL的存在…

报错惹QAQ

= =于是本小笨蛋决定CASE:

UPDATE Tmp
SET Tmp.PJ_DD_MZL = (CASE Tmp.DD_sftCount
                         WHEN 0 THEN 0
                         ELSE CONVERT(FLOAT, TMP.DD_sftCount) / CONVERT(FLOAT, TMP.Amount) END),
    Tmp.DD_XS_MZL = (CASE Tmp.HJSQXS WHEN 0 THEN 0 ELSE CONVERT(FLOAT, DD_MZXS) / CONVERT(FLOAT, HJSQXS) END)
FROM #tmp_Pjddmzl AS Tmp

UPDATE后的数据

大功告成(能用就行)


文章作者: Seacolorfox
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Seacolorfox !
评论