どんなとき

テーブルを外部結合した場合に、条件にマッチしないものが 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

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

使い分け

カラムが一つならシンプルな IFNULL() を、そうではないなら COALESCE() を利用する、が良さそうです。


余談ですが、

私が勉強した教材では COALESCE() のみが紹介されていました。

けれども、読みにくい単語じゃないですか ?

それよりは、 IFNULL() のほうが、名前そのままですから直感的に操作できると思います。

そもそも、 COALESCE() まで必要になるシーンは、それほど多くないと思います。