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

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

fukasawaです。こんにちは。 今週の月曜にスプラトゥーン2のチョコエッグが発売されたので買ってみました。とりあえず7個買って被りもなく、テンタクルズも揃ったので個人的には満足です。

チョコはその場に居た さん、 さん、 くん が消費してくれました。ご協力ありがとうございます。またお願いします。

fukasawa_20180228_01.png

さて、MySQLにはいろいろな関数が用意されていますが、その中にCOALESCE()という見慣れない関数があったので、今回はその使い方について見てみようと思います。
公式の「NULL 以外の最初の引数を返します」という説明の通り、指定されたリストを先頭から確認し最初に見つかったNULL以外の値を返す、という動きをします。具体的な使い方をみていきます。

使い方

以下のような、ユーザの情報を持つサンプルテーブルを用意しました。
ユーザのID、名前、固定電話番号、携帯電話番号1、携帯電話番号2がそれぞれ格納されています。

fukasawa_20180228_1.png

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;

fukasawa_20180228_2.png

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の場合は「未設定」という値を出力します。

fukasawa_20180228_3.png

  • 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;

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ