红移被零除益智游戏

红移被零除益智游戏

问题描述:

我得到一个除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中工作。我认识到总结需要总结的内容,而不是在求和之前进行计算,这是一个更好的编程实践。但仍然很好奇。

+1

'CASE WHEN DENOMINATOR> = 0' .... ....似乎是错的...如果你试图避免0错误的分裂......你不是指'>'0不是'> ='或只要''0,如果你想允许否定? – xQbert

+0

我猜是否定的分母应该是0.因此,其他的只是> not> = – xQbert

+0

负数问题与问题无关。关键是DEMONIMATOR不应该是零。我试图理解为什么一个人工作,另一个人给我一个错误。 – cjremley

我想,以避免除以零的最好方法是使用nullif()

SUM(INT1 * INT2/NULLIF(DENOMINATOR, 0)) 

或:

SUM(INT1) * INT2/NULLIF(DENOMINATOR, 0) 

这将返回NULL,我找了分频更明智逐零的情况。如果你喜欢,你可以添加COALESCE()来得到0

+0

如何应对DENOMINATOR的负值? –

+0

@JonScott。 。 。你需要一个'CASE'来处理它们。 –