メッセージ 8134、レベル 16、状態 1、行 n
0 除算エラーが発生しました。
Server: Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.
SQLで0除算を回避するコードを紹介します。
下記のテーブルの場合を例にします。
| id | category | total | count |
|---|---|---|---|
| 1 | チェア | 1500000.00 | 25 |
| 2 | テーブル | 650000.00 | 3 |
| 3 | サイドボード | 0.00 | 0 |
| 4 | 箪笥 | 680000.00 | 8 |
| 5 | ベッド | 154000.00 | 1 |
| 6 | 本棚 | 250000.00 | 5 |
下記のSQLを実行すると0除算エラーになります。
select category from TotalA where total / count > 100000
ID=3のサイドボードの項目のcountが"0"であるため、上記のSQLを実行すると0除算エラーが発生します。
回避方法としてNULLIF関数を利用する方法があります。
条件式1と条件式2が一致した場合、nullを返します。数値を0で割ると除算エラーが起きますが、nullで割る場合は結果はnullとなり除算エラーは発生しません。0になる可能性のある項目をNULLIF関数に置き換え、(条件式1)に0になる可能性のある項目を、(条件式2)に"0"を与えます。
先のエラーになったSQLを以下のSQLに変更して実行します。
select category, total/count as price from TotalA where total / NULLIF(count,0) > 100000
| category | price |
|---|---|
| テーブル | 216666.666666 |
| ベッド | 154000.000000 |
nullで除算すると結果は"null"になります。
select 1000/null as value
| value |
|---|
| NULL |