どんなとき
テーブルを外部結合した場合に、条件にマッチしないものが NULL
になってしまうことがあります。
数値を期待しているのに NULL
が入っていると、いろいろとかっこ悪いですよね ?
対応方法
2 つの関数が利用できます。
- IFNULL
- COALESCE
IFNULL
まずは IFNULL()
です。
構文
1IFNULL([引数1], [引数2])
説明
1SELECT IFNULL(`nullable_column`, 0) FROM `example_table`;
IFNULL()
は IFNULL([引数1], [引数2])
のように、2 つの引数を取ります。
挙動は
[引数1]
がNULL
でなければ[引数1]
をかえす[引数1]
がNULL
ならば、[引数2]
をかえす
という挙動です。
if else
なのでシンプルな挙動ですね。
マニュアル
MySQL 5.6 リファレンスマニュアル
関数と演算子 / 制御フロー関数 / IFNULL
https://dev.mysql.com/doc/refman/5.6/ja/control-flow-functions.html#function_ifnull
関数と演算子 / 制御フロー関数 / IFNULL
https://dev.mysql.com/doc/refman/5.6/ja/control-flow-functions.html#function_ifnull
COALESCE
次に COALESCE()
です。
構文
1COALESCE([引数], ...)
説明
IFNULL()
と異なる点は、 引数を 2 つ以上指定できる という点で、
- 引数を左から評価していき、最初に
NULL
ではないものが見つかれば、それをかえす - すべての引数が
NULL
の場合は、仕方がないのでNULL
をかえす
という挙動になっています。
IFNULL()
と同じように
1SELECT COALESCE(`nullable_column`, 0) FROM `example_table`;
と書くこともできますが、
1SELECT COALESCE(
2 `nullable_column_1`,
3 `nullable_column_2`,
4 `nullable_column_3`,
5 0
6 ) FROM `example_table`;
のように、たくさんの引数を指定することもできる、という関数です。
if
のあとにいくつか elseif
を並べていくイメージですね。
マニュアル
MySQL 5.6 リファレンスマニュアル
関数と演算子 / 演算子 / 比較関数と演算子 / COALESCE
https://dev.mysql.com/doc/refman/5.6/ja/comparison-operators.html#function_coalesce
関数と演算子 / 演算子 / 比較関数と演算子 / COALESCE
https://dev.mysql.com/doc/refman/5.6/ja/comparison-operators.html#function_coalesce
使い分け
カラムがひとつならシンプルな IFNULL()
を、そうではないなら COALESCE()
を利用する、が良さそうです。
余談ですが、
私が勉強した教材では COALESCE()
のみが紹介されていました。
けれども、読みにくい単語じゃないですか ?
それよりは、 IFNULL()
のほうが、名前そのままですから直感的に操作できると思います。
そもそも、 COALESCE()
まで必要になるシーンは、それほど多くないと思います。