在 Sql 视图中除以零错误
Divide by zero error in Sql View
每次执行我的 select 语句的这一部分时,我都会得到除以零异常。
我尝试用 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,
我相信答案可能就在这一点上:
* ISNULL(targetu.bushelsperunit, 1)
如果 targetu.bushelsperunit 为 0,代码可能会在执行前一个 / 之前执行 *,导致除以 0。该字段是否应该在分母中?
尝试使用 "nvl" 函数。喜欢 nvl(yourfield, 0)
您应该检查 /
之后的语句,因为 CASE WHEN
语句可能会导致零。
使用另一个 CASE WHEN
以确保 /
之后没有零
还要注意 *
,因为它可能会在您不期望的情况下将结果归零!
我认为任何条款:
ISNULL(limit_limitcommodity.priceperpound, 1)
ISNULL(l.PoundsPerUnit, 1)
ISNULL(targetu.bushelsperunit, 1)
可能是 returning 0 因为您只检查 null 而不是零。例如如果 l.PoundsPerUnit=0 然后检查 ISNULL(l.PoundsPerUnit,1) 仍然会 return 零。
我认为这样的事情应该可以解决您的问题。它不检查空值,而是检查所有分母的空值或零,并改为插入 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,
每次执行我的 select 语句的这一部分时,我都会得到除以零异常。 我尝试用 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,
我相信答案可能就在这一点上:
* ISNULL(targetu.bushelsperunit, 1)
如果 targetu.bushelsperunit 为 0,代码可能会在执行前一个 / 之前执行 *,导致除以 0。该字段是否应该在分母中?
尝试使用 "nvl" 函数。喜欢 nvl(yourfield, 0)
您应该检查 /
之后的语句,因为 CASE WHEN
语句可能会导致零。
使用另一个 CASE WHEN
以确保 /
之后没有零
还要注意 *
,因为它可能会在您不期望的情况下将结果归零!
我认为任何条款: ISNULL(limit_limitcommodity.priceperpound, 1) ISNULL(l.PoundsPerUnit, 1) ISNULL(targetu.bushelsperunit, 1)
可能是 returning 0 因为您只检查 null 而不是零。例如如果 l.PoundsPerUnit=0 然后检查 ISNULL(l.PoundsPerUnit,1) 仍然会 return 零。
我认为这样的事情应该可以解决您的问题。它不检查空值,而是检查所有分母的空值或零,并改为插入 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,