0

每次执行我的选择语句的这一部分时,我都会得到一个除以零异常。我尝试用 NUllIF 替换 ISNULL。同样的错误。这是我的代码:

isnull([Balance], 0) * isnull(sce.tradepoundsperunit, 0)  * (isnull(limitallocation_limitcommodity.priceperpound, 0) / CASE WHEN ISNULL(limit_limitcommodity.priceperpound, 1) = 0 THEN 1 ELSE  ISNULL(limit_limitcommodity.priceperpound, 1) END )  / isnull(CASE WHEN ISNULL(l.PoundsPerUnit, 1) = 0 THEN 1 ELSE  ISNULL(l.PoundsPerUnit, 1) END *  ISNULL(targetu.bushelsperunit, 1) ,1)   

AS Limitconvertedbalance,

4

4 回答 4

1

我认为任何条款: ISNULL(limit_limitcommodity.priceperpound, 1) ISNULL(l.PoundsPerUnit, 1) ISNULL(targetu.bushelsperunit, 1)

可能会返回 0,因为您只检查 null 而不是零。例如,如果 l.PoundsPerUnit=0 则检查 ISNULL(l.PoundsPerUnit,1) 仍将返回零。

我认为这样的事情应该可以解决您的问题。它不是检查空值,而是检查所有分母的空值或零,而是插入 1。

isnull([Balance],0) *
isnull(sce.tradepoundsperunit,0) *
(
    isnull(limitallocation_limitcommodity.priceperpound,0)
    /
    CASE
        WHEN limit_limitcommodity.priceperpound IS NULL OR limit_limitcommodity.priceperpound=0 THEN 1
        ELSE limit_limitcommodity.priceperpoind
    END
) /
(
    CASE 
        WHEN l.PoundsPerUnit IS NULL OR l.PoundsPerUnit =0 THEN 1
        ELSE l.PoundsPerUnit
    END *
    CASE
        WHEN targetu.bushelsperunit IS NULL OR targetu.bushelsperunit=0 THEN 1
        ELSE targetu.bushelsperunit
    END
)
AS Limitconvertedbalance,
于 2015-08-26T21:04:36.773 回答
0

我相信答案可能就在这一点:

* ISNULL(targetu.bushelsperunit, 1)

如果 targetu.bushelsperunit 为 0,则代码可能在执行前一个 / 之前执行该 *,从而导致除以 0。该字段是否意味着在分母中?

于 2015-08-24T20:07:45.917 回答
0

尝试使用“nvl”功能。像 nvl(yourfield, 0)

于 2015-08-24T20:07:53.847 回答
0

您应该检查后面的语句,/因为该CASE WHEN语句可能会导致零。使用另一个CASE WHEN来确保在 之后没有零/ 也请注意,*因为它可能会在您意想不到的地方出现零结果!

于 2015-08-24T20:11:29.190 回答