コマンド道場

$ man nullif

NULLIF

条件・NULL の関数

2 つが等しいときだけ NULL を返す。0 除算よけと、集計からの除外に使う。

呼び出しの形

NULLIF(値1, 値2)

つまずきやすいところ

  • 比較は = です。どちらかが NULL なら「等しい」にはならず、a がそのまま返ります。

  • NULLIF が返すのは a の型です。a と b の型が違うと、比較のために型変換が起き、思わぬ結果になることがあります。

  • 0 除算よけに使うと、結果が NULL になります。0 として扱いたいなら COALESCE と組み合わせてください。

実行例

結果は実際に流したものです。同じ SQL を 自由に打てる画面 で試すと、同じ結果になります。

0 で割らないようにする
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_idgyo_nosuryotankatanka_per_ko
10011201809.0000000000000000
10012301204.0000000000000000
1002122380011900.0000000000000000
1002211850018500.0000000000000000
10031442001050.0000000000000000
10032289004450.0000000000000000
100415248004960.0000000000000000
100511018018.0000000000000000

17(うち 8 行を表示)

数量が 0 の明細では、エラーにならず NULL になります。

0 の行を平均から外す
SELECT AVG(suryo) AS zenbu, AVG(NULLIF(suryo, 0)) AS zero_nozoku FROM juchu_meisai
zenbuzero_nozoku
10.647058823529411811.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

製品ごとの対応表(根拠つき)を見る

次に読む

関係する関数

根拠にした一次情報