提问者:小点点

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


我正在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相同

NB:VALUE1、VALUE2、VALUE3和VALUE4是计算列;VALUE1=sum(col1)sum(col2)…

感谢和问候


共2个答案

匿名用户

这完全取决于你是否要计算一个值,如果它会导致无限的值。你可以忽略这些特定的实例,并根据余数进行计算,正如戈登的回答所建议的那样:

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

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

value3 / nullif(value2, 0) * 100

我不理解您认为这是一个计算列会导致问题的论点。如果它是一个虚拟列,那么您的表将永远不会创建,因为在留档中指定的虚拟列不能通过名称引用另一个。

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

匿名用户

在您的代码中,您有:

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 . . .
     )