SQL で 割り算(除算) を行う際、
分母が 0 になると 0除算エラー が発生します。
特に、
-
集計結果
-
売上 ÷ 件数
-
比率・平均値計算
などでは、実務で頻繁に遭遇するトラブルです。
この記事では、NULLIF を使って安全に0除算を回避する方法 を中心に解説します。
0除算エラーとは?
例えば、以下のような SQL を実行した場合です。
|
1 2 |
SELECT sales / count FROM summary_table; |
もし count = 0 の行が存在すると、DB によっては以下のようなエラーになります。
-
Oracle:
ORA-01476: divisor is equal to zero -
PostgreSQL / MySQL:division by zero エラー
👉 SQL自体が失敗する ため、結果が1件も返らないケースもあります。
NULLIF を使った基本的な回避方法
NULLIF とは?
-
値1 と 値2 が 等しければ NULL
-
等しくなければ 値1 を返す
この性質を使って、
0 を NULL に変換してから割り算 します。
基本形(最もよく使う)
|
1 2 3 |
SELECT sales / NULLIF(count, 0) AS avg_sales FROM summary_table; |
動作イメージ
| count | NULLIF(count,0) | 計算結果 |
|---|---|---|
| 10 | 10 | 正常計算 |
| 1 | 1 | 正常計算 |
| 0 | NULL | 結果は NULL(エラーにならない) |
👉 0除算エラーが発生しない のが最大のメリットです。
集計関数と組み合わせる例
SUM / COUNT を使う場合
|
1 2 3 |
SELECT SUM(sales) / NULLIF(COUNT(order_id), 0) AS avg_sales FROM orders; |
-
注文が1件もない場合
→COUNT = 0
→ 結果はNULL
実務で非常によく使われる書き方です。
CASE 文での回避方法(比較)
NULLIF を使わず、CASE で書くことも可能です。
|
1 2 3 4 5 6 |
SELECT CASE WHEN count = 0 THEN NULL ELSE sales / count END AS avg_sales FROM summary_table; |
比較すると…
| 方法 | 特徴 |
|---|---|
| NULLIF | シンプル・可読性が高い |
| CASE | 条件が複雑な場合に向く |
👉 単純な0除算回避なら NULLIF が最適 です。
結果を 0 表示にしたい場合(COALESCE)
NULL ではなく 0 を表示したい ケースもあります。
|
1 2 3 |
SELECT COALESCE(sales / NULLIF(count, 0), 0) AS avg_sales FROM summary_table; |
-
0件 → 0
-
それ以外 → 正常な計算結果
レポート・画面表示用 SQL ではよく使います。
よくある注意点
❌ IFNULL / NVL で 0 に戻すのはNG
|
1 2 |
-- NG例 sales / IFNULL(count, 0) |
👉 0に戻してしまうため、結局0除算エラー になります。
小数点計算にも注意
整数同士の割り算だと、DB によっては整数除算になります。
|
1 2 |
-- Oracle / PostgreSQL 対策 sales * 1.0 / NULLIF(count, 0) |
まとめ
-
SQL の割り算では 0除算エラー対策が必須
-
NULLIF(分母, 0)を使うのが 最もシンプルで安全 -
表示用途では
COALESCEと組み合わせる -
実務SQL・集計SQLでは必須テクニック

