dポイントプレゼントキャンペーン実施中!

SQLのWHERE文の中で計算をしているのですが、「除数が0です」とのエラーがでてしまいます。
同じ計算をSELECT文の中にいれると、エラーにならず、計算結果がでるのですが、どうしてでしょうか?

SELECT DATA, (A + B - C) / (A + B) * 100
FROM table
↑この時は計算結果がでます。

SELECT DATA
FROM table
WHERE (A + B - C) / (A + B) * 100 <= 50.0
↑「除数が0です」といわれてしまいます。

A 回答 (2件)

>>同じ計算をSELECT文の中にいれると、


>>エラーにならず、計算結果がでるのですが、どうしてでしょうか?
DBによってはエラーになります
Oracleではエラーにならないのかな?
今Oracle環境が無いものでわかりません
SELECT DATA, (A + B - C) / (A + B) * 100 FROM table
の結果はoracleどうなっているのですか?
A+B=0である場合に無限をあらわす値がどう表されているか知りたいです
他のDBでもエラーが出ないようにする方法としては
(A + B - C) / (A + B) * 100を
case when A+B=0 then null else (A + B - C) / (A + B) * 100 end
と表すほうが安全です

SELECT DATA FROM table WHERE (A + B - C) / (A + B) * 100 <= 50.0
ですが上記のようにcaseを使用しても良いですが
(A + B - C) / (A + B) * 100 <= 50.0 を
(A + B - C) * 100 <= (A + B) * 50.0 と
しても良いのではないでしょうか?
ただしA+B=0場合に前者は不明、後者はC>=0でtrue,C<0でfalseになる違いがあることに注意してください

この回答への補足

SELECT DATA, (A + B - C) / (A + B) * 100 FROM tableだと
割り切れず、13.37281153.....というような結果が返ってきます。
このあたりが原因のような気もするのですが、TRUNC関数で
少数以下の桁数をあわせてもだめでした。
(A + B - C) * 100 <= (A + B) * 50.0とするとうまくいくのですが、
A,B,Cのいずれかが0になる場合もあるので、そのあたりを検証してみたいと思います。

補足日時:2006/01/16 13:26
    • good
    • 0

100 <= 50.0の部分を先に論理演算して、”偽”だから数値的にはゼロにしているのではないでしょうか。



エラーになるのかもしれませんか、
SELECT 100 <= 50.0 FROM table
の結果はどうなるでしょうか。

WHERE ( (A+B-C)/(A+B)*100 ) <= 50.0
だと、どういう結果になるでしょうか。

この回答への補足

SELECT 100 <= 50.0 FROM table だとエラーになりました。
( (A+B-C)/(A+B)*100 ) <= 50.0でも試してみたのですがm
やはり「除数が0です」と言われてしまいます...。

補足日時:2006/01/16 13:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!