我用这段代码得到了0分之差:
CASE
WHEN DENOMINATOR >= 0
THEN SUM(INT1 * INT2 / DENOMINATOR)
ELSE 0
END AS RATIO
但是,当我更改为以下代码时,它可以正常工作。
CASE
WHEN DENOMINATOR >= 0
THEN SUM(INT1) * INT2 / DENOMINATOR
ELSE 0
END AS RATIO
有人可以帮我理解原因,以便将来可以避免这种情况吗? BTW,第一个样本在Vertica中运行。我实现了总结需要求和的东西而不是在求和之前进行计算是一种更好的编程实践。但仍然很好奇。
答案 0 :(得分:9)
我认为避免被零除的最佳方法是使用nullif()
:
SUM(INT1 * INT2 / NULLIF(DENOMINATOR, 0))
或:
SUM(INT1) * INT2 / NULLIF(DENOMINATOR, 0)
这会返回NULL
,我发现对于零除零情况更为明智。如果您愿意,可以添加COALESCE()
以获取0
。