$ man nullif
NULLIF
条件・NULL の関数2 つが等しいときだけ NULL を返す。0 除算よけと、集計からの除外に使う。
呼び出しの形
NULLIF(値1, 値2)
つまずきやすいところ
比較は
=です。どちらかが NULL なら「等しい」にはならず、a がそのまま返ります。NULLIFが返すのは a の型です。a と b の型が違うと、比較のために型変換が起き、思わぬ結果になることがあります。0 除算よけに使うと、結果が NULL になります。0 として扱いたいなら
COALESCEと組み合わせてください。
実行例
結果は実際に流したものです。同じ SQL を 自由に打てる画面 で試すと、同じ結果になります。
SELECT juchu_id, gyo_no, suryo, tanka, tanka / NULLIF(suryo, 0) AS tanka_per_ko FROM juchu_meisai ORDER BY juchu_id, gyo_no
| juchu_id | gyo_no | suryo | tanka | tanka_per_ko |
|---|---|---|---|---|
| 1001 | 1 | 20 | 180 | 9.0000000000000000 |
| 1001 | 2 | 30 | 120 | 4.0000000000000000 |
| 1002 | 1 | 2 | 23800 | 11900.0000000000000000 |
| 1002 | 2 | 1 | 18500 | 18500.0000000000000000 |
| 1003 | 1 | 4 | 4200 | 1050.0000000000000000 |
| 1003 | 2 | 2 | 8900 | 4450.0000000000000000 |
| 1004 | 1 | 5 | 24800 | 4960.0000000000000000 |
| 1005 | 1 | 10 | 180 | 18.0000000000000000 |
17 行(うち 8 行を表示)
数量が 0 の明細では、エラーにならず NULL になります。
SELECT AVG(suryo) AS zenbu, AVG(NULLIF(suryo, 0)) AS zero_nozoku FROM juchu_meisai
| zenbu | zero_nozoku |
|---|---|
| 10.6470588235294118 | 11.3125000000000000 |
1 行
集約関数は NULL を無視するので、NULLIF で 0 を NULL にすれば分母から外れます。
説明
NULLIF(a, b) は a と b が等しいときだけ NULL を返し、そうでなければ a をそのまま返します。COALESCE とちょうど逆向きの働きです。
いちばんの使い道は 0 除算よけです。a / NULLIF(b, 0) と書けば、b が 0 のときは NULL になり、エラーになりません。「割れないときは値なし」という自然な結果になります。
もう一つは「特定の値を集計から外す」使い方です。集約関数は NULL を無視するので、AVG(NULLIF(数量, 0)) と書けば0 の行を平均から外せます。
⚠️ 比較は等価比較(=)です。どちらかが NULL のときは等しいと判定されないので、そのまま a が返ります。
ほかの製品でも通るか
未確認の製品があります そのまま使える: PostgreSQL / MySQL / MariaDB / SQLite / SQL Server / Oracle Database
未確認: IBM Db2
次に読む
使い方を順に読むなら
根拠にした一次情報
- PostgreSQL 18 マニュアル: 条件式(2026-09-02 確認)