场景:
开发中写了带除法的SQL
问题描述
在遇到validRoomArea
为空的情况,就会出现DB::Exception: Division by zero: while executing 'FUNCTION divide
异常
原因分析:
使用case when
或者 if
进行判断,依旧还是报错
原因可能还是跟Decimal底层的存储结构有关,底层应该做了限制,并且在除法运算中
无论条件如何,都会评估 if() 的 else 参数
解决方案:
既然无论条件是什么,都会评估 if() 的 else 参数,那么在扫描的时候,加判断转化为数字,避免报错
select sum((case
when room_total_price > 0 and room_area > 0 and room_num > 0 then room_area
else null end)) as validRoomArea,
sum((case
when room_total_price > 0 and room_area > 0 and room_num > 0 then room_total_price
else null end)) as validTotalPrice,
if(validRoomArea<>0, validTotalPrice/(validRoomArea+if(validRoomArea<>0,0,1)), null) as dealPrice,
C.board_id as boardId
FROM house.dwd_house_deal_new as A