我在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列。
谢谢和问候
答案 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 . . .
)