我正在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)…
感谢和问候
这完全取决于你是否要计算一个值,如果它会导致无限的值。你可以忽略这些特定的实例,并根据余数进行计算,正如戈登的回答所建议的那样:
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 . . .
)