• 締切済み

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

  • sprit
  • お礼率66% (45/68)
  • Oracle
  • 回答数2
  • ありがとう数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

  • from...where を from...join..on にするには

    以下のSQL文は from ... where ... で書かれていますが これを from ... join ... on ... で書き直したいのですが可能でしょうか? select X.col1, U.col1 from TABLE_X as X ,TABLE_U as U where U.REC_NO = (select B.REC_NO from TABLE_A as A, TABLE_B as B where A.ITME = B.ITEM and X.DATA = A.DATA fetch first 1 row only ) むずかしくしているのは、fetch first 1 row only なのですが これがないと where句のかっこのなかのselect文は複数の結果を返します しかし、その複数の結果はすべて同じものになることがデータ上保証されています 。 fetch first を除いて select distinct としても同じ結果となりますが パフォーマンスがひどく低下してしまいます。

  • サブクエリを利用したSQL文から複数の抽出条件

    例えば、以下のようなサブクエリを利用したSQL文があります。 SELECT table_a.* FROM table_a LEFT JOIN (SELECT table_b.* FROM table_b LEFT JOIN table_c ON (table_b.id = table_c.bid) WHERE table_b.type='1') AS tbl ON (table_a.id = tbl.aid) このSQL文にWHERE句で条件を指定したいのですが、サブクエリで指定しているtblテーブルのvalueフィールドが「1」と「20」のものを抽出したいと思います。 WHERE (tbl.value='1' AND tbl.value='20') としても結果が帰って来ません。 これは、WHEREする条件の数だけ、サブクエリでテーブルを作って条件を指定するのでしょうか? 効率が悪そうなので、他の方法があるのではと思いご質問させて頂きました。 お分かりになる方がいれば、よろしくお願いします。

  • SQL文でWhere+orを使う理由

    ItemsテーブルからValueにAという値かBという値を持ってる人のNameを取得するSQL文について調べたのですが、以下のようになってました。 SELECT Name FROM Items WHERE Value IN ('A', 'B') これで動く結果については納得できたのですが、ORを使っても良いのではないでしょうか。以下のようなやり方は出来ないのかと思ったのですが SELECT Name FROM Items WHERE Value = 'A' or 'B' のように=(イコール)の後の値にorをつけるという書き方は見当たりませんでした。これで動かない場合、以下の方法なら動くはずだと思います。 SELECT Name FROM Items WHERE Value = 'A' or Value = 'B' おそらく結果はINを使った場合と同じだと思うのですが、これはどのようにして使い分けられているのでしょうか?文の短さで言えば値が複数の場合はINの方がはるかに短くなってスマートですが、単数でもINの方が短く済みそうな気がします。INの後のカッコ内に更にSQL文を書くことも出来ますし、Where+orの意義がよく分からなくなってきました。

  • こんなSQL文

    Oracle8.1.7を使用しております。 以下のようなテーブルに対し、1行目と2行目を削除するSQL文を書きたいのですが、思いつきません。どなたか、アドバイスいただけないでしょうか? 表名:A   B | C ――――――――   2 | 10   2 | 1   1 | 10   1 | 1   1 | 11   1 | 2   1 | 1   3 | 10   2 | 3 変数として、P1=1とP2=2があります。(これは、SQL文の中に直接書くものとします。) ここで、SELECT B,C FROM A WHERE B=1;とSELECT B,C FROM A WHERE B=2;を実行すると、次のようになります。   B | C     B | C ――――――――― ―――――――――   1 | 10    2 | 10   1 | 1     2 | 1   1 | 11    2 | 3   1 | 2   1 | 1 ここで、それぞれの表を見ると、Cの値が一致している部分があります。この一致していて、Bが2の行を削除したいのですが、SQL1文では無理でしょうか? 最近、SQLには慣れてきたつもりだったのですが、こんなとこでつまずくとは・・・どうぞよろしくお願いします。

  • SQL文の作成について

    はじめまして SQL Serverを使用テーブルの更新クエリを作っています。 ◆質問 副問合せの結果をIn句で見ていますがExists句の方がパフォーマンスがあるといわれているので直したいと思っています。 可能でしょうか? ◆SQL文 UPDATE [TABLE_A] SET Data = null WHERE Code IN (Select Code From [TABLE_B] B, [TABLE_C] C Where (B.Start <= GetDate() AND C.End >= GetDate()) AND (B.TimeCode = C.TimeCode)) ◆KEY [TABLE_A].Code = [TABLE_B].Code [TABLE_B].TimeCode = [TABLE_C].TimeCode ◆[TABLE_A] Code Data 001 100 002 200 003 300 004 400 <- DataをNullにする ◆[TABLE_B] Code TimeCode 001 AAA 002 AAA 003 AAA 004 BBB <- 今日2/18ヒット 001 CCC 002 CCC ◆[TABLE_C] TimeCode Start End AAA 2009/1/1 2009/2/15 BBB 2009/2/13 2009/2/20 <- 今日2/18ヒット CCC 2009/2/19 2009/10/5 データは[TABLE_A] 6万件、[TABLE_B]が20万件、[TABLE_C]が100件程度です。 夜遅くにすみませんがお願いします。

  • SELECT のWHEREに別のSELECT

    SELECT のWHEREに別のSELECTの結果を当てはめることは可能でしょうか? ただし、引用テーブルは同じテーブルとします。(DDD) 例 SELECT * FROM DDD WHERE B = (SELECT B FROM DDD WHERE C=1) 再起SQLとはまた違うのでしょうか?

  • 0の除算

    PostgreSQLのSQL文で0の割り算だと計算をしないで, 0やNullを返すようなSQL文を作りたいのですが, 分かりますか? 例えば select field0, ( field1 / field2 ) as result; だと「field2」が0の場合エラーがでてしまいます。 field0は出力したいのでWhere文で Where field2 <> 0 は使えません。 オラクルではdecodeという関数が使えるようですが。

  • SQL whereの中のif文について

    SQLの中にif文を使いたいですが、 うまくいきません。 やはりwhereの中で使えないですか? アドバイスお願いします。 実際のSQL文: $sql = "select * from room";     $sql = $sql . " WHERE ((Keisai = 1)"; if(Chinryou1>0){ $sql = $sql . " and (Chinryou1 <= {$rent1})";     }else if(Chinryou1==0){ $sql = $sql . " and (Chinryou2 <= {$rent1})";    } $sql = $sql . ")"; $sql = $sql . " order by Narabijun desc, Name"; $sql = $sql . ";"; $result = mysql_query($sql, $conn); $num = mysql_num_rows($result);

    • ベストアンサー
    • MySQL
  • このSQL文の意味を教えてください。

    SQL勉強中の者です。このSQL文の意味を教えてください。 SELECT A.* FROM table AS A, table AS B WHERE A.id *= B.id AND A.flag = 1 tableにAとBという別名をつけて、Aの全ての項目を抽出しているというところまでは分かりました。 分からないのは「WHERE A.id *= B.id」の部分です。ただの「=」なら分かりますが「*=」って何ですか? あと、AとBのテーブルが同じなのですが、同じテーブルを2つ並べている意味がよく分かりません。 よろしくお願いします。

  • SQL文で

    SQLのWHEREの条件文の中に、「(+)」というのがあるのですが、 どういう意味なのでしょうか? select * from Office WHERE a.Office_cd=b.Office_cd(+) といった感じですが。 よろしくお願いします。