【SQL】値がNULLでなくなるまで調べてくれるCOALESCE関数について

SQL プログラミング

  • Q:例えば、顧客データベースの中から各世帯が持っている携帯電話の番号を調べたいとする、しかし全員が携帯電話を持っているとは限らない。親が高齢な場合は、子供が携帯番号を持っているはず、でもSQLで抽出するにはどうしたらいいだろう。
  • A:COALESCE関数を使うと便利です!

スポンサードサーチ

COALESCE関数とは

  • COALESCE関数の書き方:COALESCE(A,B,C);

COALESCE関数は、MySQLのリファレンスマニュアルでは「NULL 以外の最初の引数を返す」とまとめられています。

mysql> SELECT COALESCE(NULL,1);
-> 1
mysql> SELECT COALESCE(NULL,NULL,NULL);
-> NULL

リファレンスマニュアルに書かれている事例

例えば、冒頭の携帯電話の番号で考えた場合、まずは親の携帯番号、次に子の携帯番号、最後に孫の携帯番号と調べる場合は、以下のように書くことができると思います。

mysql> SELECT COALESCE(parent_phone,child_phone) FROM user;
-> (親の番号がなかったら、子の番号が返る)
mysql> SELECT COALESCE(parent_phone,child_phone,grandchild_phone);
-> (親の番号、子の番号がなかったら、孫の番号が返る)

「もし〜〜が無かったら」というif文のような分岐は、SQLでもう一つCASE WHEN EXISTSを用いた書き方がありますが、COALESCE関数よりは明らかに作文量が多くなってしまうことが分かると思います。

もし、携帯番号を示す項目がデータベースの中に一つしかなくて、ユーザー属性をパラメータで管理しているような場合は、COALESCE関数が不向きだと思われます、その場合はCASE WHENを使って記述してみてください。

参考リンク

値がNULLだった場合は指定した別の値を返す(ifnull関数, coalesce関数) (DB Online)・・・SQLiteの紹介になっていますが、内容はほぼ同じです。

【MySQL】最初に見つかった「NULLじゃない」値を返すCOALESCE()を使ってみる。(バシャログ)