【MySQL】最初に見つかった「NULLじゃない」値を返すCOALESCE()を使ってみる。
fukasawaです。こんにちは。 今週の月曜にスプラトゥーン2のチョコエッグが発売されたので買ってみました。とりあえず7個買って被りもなく、テンタクルズも揃ったので個人的には満足です。
チョコはその場に居た kimoto さん、 gami さん、 sagara くん が消費してくれました。ご協力ありがとうございます。またお願いします。
さて、MySQLにはいろいろな関数が用意されていますが、その中にCOALESCE()という見慣れない関数があったので、今回はその使い方について見てみようと思います。
公式の「NULL 以外の最初の引数を返します」という説明の通り、指定されたリストを先頭から確認し最初に見つかったNULL以外の値を返す、という動きをします。具体的な使い方をみていきます。
使い方
以下のような、ユーザの情報を持つサンプルテーブルを用意しました。
ユーザのID、名前、固定電話番号、携帯電話番号1、携帯電話番号2がそれぞれ格納されています。
CREATE TABLE test_users (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
landline_phone VARCHAR(50),
mobile_phone1 VARCHAR(50),
mobile_phone2 VARCHAR(50)
);
固定電話番号があったらそれを、無かったら携帯電話番号1を、それもなかったら携帯電話番号2を取得する、といった場合、COALESCE()を使って以下のように参照することができます。
SELECT
id,
name,
COALESCE(landline_phone, mobile_phone1, mobile_phone2) AS phone
FROM test_users;
COALESCE()はこのように、指定されたリストを先頭から確認し、最初に見つかったNULLでは無い値を返すという動きをします。
IFNULL()の代わりに使う
COALESCE()はIFNULL()の代わりに使うこともできるようです。
-- COALESCE()
SELECT
id,
name,
COALESCE(landline_phone, '未設定') AS phone
FROM test_users;
-- IFNULL()
SELECT
id,
name,
IFNULL(landline_phone, '未設定') AS phone
FROM test_users;
固定電話番号がNULLの場合は「未設定」という値を出力します。
- IFNULL(expr1,expr2): expr1 が NULL でない場合、IFNULL() は expr1 を返し、それ以外の場合は expr2 を返します。
NULLの場合に別の値に置き換えるやり方として、他にもIF()やCASE 演算子を使った方法がありますが、幾つかの値をリストで渡して全部NULLだったら置換する、場合はCOALESCE()を使うとシンプルに書けそうです。 (そういったパターンはあまりなさそうですが。)
SELECT
id,
name,
COALESCE(landline_phone, mobile_phone1, mobile_phone2, '未設定') AS phone
FROM test_users;