• 締切済み

WHERE文の中で除算

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です」といわれてしまいます。

みんなの回答

  • 7marine
  • ベストアンサー率36% (59/160)
回答No.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になる違いがあることに注意してください

sprit
質問者

補足

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になる場合もあるので、そのあたりを検証してみたいと思います。

  • akipapa
  • ベストアンサー率38% (34/89)
回答No.1

100 <= 50.0の部分を先に論理演算して、”偽”だから数値的にはゼロにしているのではないでしょうか。 エラーになるのかもしれませんか、 SELECT 100 <= 50.0 FROM table の結果はどうなるでしょうか。 WHERE ( (A+B-C)/(A+B)*100 ) <= 50.0 だと、どういう結果になるでしょうか。

sprit
質問者

補足

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

関連するQ&A