ORA-01476:SQL查询的“除数等于零”(Oracle 10g)

时间:2013-06-10 11:19:14

标签: sql oracle10g

我在oracle 10g下创建一个SQL查询,结果应该给我这样的东西:

----------------------------------------------------------------------------------
TEXT         VALUE1        VALUE2          VALUE3               VALUE4
---------------------------------------------------------------------------------
TEXT1        8795           5684        value1-value2          value3/value2*100
TEXT2        235             568            ...                   ...
TEXT3        125             23             ...                   ...
TEXT4        789             58             ...                   ...
TEXTN         0               0             ...                   ...

当我尝试计算VALUE4列时,我收到此错误:

ORA-01476: le diviseur est égal à zéro
01476. 00000 -  "divisor is equal to zero"
*Cause:    
*Action:

我尝试了DECODE函数,但我仍然有同样的错误,CASE

也是如此

注意:VALUE1,VALUE2,VALUE3和VALUE4是计算列; VALUE1 = sum(col1)+ sum(col2)..以及其他VALUE2列。

谢谢和问候

2 个答案:

答案 0 :(得分:12)

这一切都取决于你是否想要计算一个值,如果它会导致无限值。您可以忽略这些特定实例,并根据Gordon's answer建议用剩余部分计算:

case when value2 <> 0 then value3 / value2 * 100 end

或者,如果要忽略它们,可以使用NULLIF()将值更改为NULL而不计算任何内容:

value3 / nullif(value2, 0) * 100

我不明白您的争论是这是一个计算列会导致问题。如果它是一个虚拟列,那么您的表将永远不会创建,如the documentation中所指定的,虚拟列不能按名称引用另一个。

如果它不是虚拟列,那么您可以在正常的select语句中执行此操作。

答案 1 :(得分:3)

在您的代码中,您拥有:

select value3/value2*100 as value4

你应该:

select (case when value2 <> 0 then value3/value2*100 end) as value4

鉴于你的问题:

select value1, value2, value3,
       (case when value2 is not null then value3 / value2 * 100 end) as value4
from (select value1, value2, (value1 - value2) as value3
      from . . .
     )