9

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 列についても同様です。

感謝と敬意

4

2 に答える 2

19

無限値になるかどうかは、値を計算するかどうかによって異なります。ゴードンの答えが示唆するように、これらの特定のインスタンスを無視して残りを計算できます。

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

または、それらを無視したい場合はNULLIF()、値を NULL に変更して何も計算しないようにすることができます。

value3 / nullif(value2, 0) * 100

これが計算列であることが問題を引き起こすというあなたの主張を理解できません。仮想列の場合、ドキュメントで指定されているように、仮想列は名前で別の列を参照できないため、テーブルは作成されません。

仮想列でない場合は、通常どおり select ステートメントでこれを行うことができます。

于 2013-06-10T11:32:05.827 に答える
5

あなたが持っているあなたのコードで:

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 . . .
     )
于 2013-06-10T11:22:17.680 に答える