红移被零除益智游戏
问题描述:
我得到一个除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
有人能帮我理解原因,所以我可以在将来避免这种情况吗?顺便说一句,第一个样品在Vertica中工作。我认识到总结需要总结的内容,而不是在求和之前进行计算,这是一个更好的编程实践。但仍然很好奇。
答
我想,以避免除以零的最好方法是使用nullif()
:
SUM(INT1 * INT2/NULLIF(DENOMINATOR, 0))
或:
SUM(INT1) * INT2/NULLIF(DENOMINATOR, 0)
这将返回NULL
,我找了分频更明智逐零的情况。如果你喜欢,你可以添加COALESCE()
来得到0
。
+0
如何应对DENOMINATOR的负值? –
+0
@JonScott。 。 。你需要一个'CASE'来处理它们。 –
'CASE WHEN DENOMINATOR> = 0' .... ....似乎是错的...如果你试图避免0错误的分裂......你不是指'>'0不是'> ='或只要''0,如果你想允许否定? – xQbert
我猜是否定的分母应该是0.因此,其他的只是> not> = – xQbert
负数问题与问题无关。关键是DEMONIMATOR不应该是零。我试图理解为什么一个人工作,另一个人给我一个错误。 – cjremley