COALESCE / NULLIF
| 対応: | SQL-92(1992) |
|---|
NULL値を別の値に置き換えたり、特定の値をNULLに変換したりする関数です。NULL絡みの処理を簡潔に記述できます。
構文
最初のNULLでない値を返します(標準SQL)。
SELECT COALESCE(value1, value2, value3, ...);
2つの値が等しければNULLを、異なれば値1を返します(標準SQL)。
SELECT NULLIF(value1, value2);
値がNULLならば代替値を返します(MySQL独自)。
SELECT IFNULL(value, default_value);
構文一覧
| 構文 | 概要 |
|---|---|
| COALESCE(値1, 値2, ...) | 引数を左から順に評価し、最初のNULLでない値を返します。すべてNULLの場合はNULLを返します。 |
| NULLIF(値1, 値2) | 値1と値2が等しい場合はNULLを返し、異なる場合は値1を返します。ゼロ除算の回避などに使用します。 |
| IFNULL(値, 代替値) | 値がNULLであれば代替値を、NULLでなければ値をそのまま返します(MySQL独自)。COALESCE(値, 代替値) と同義です。 |
サンプルコード
以下の『members』テーブルを例に説明します。
電話番号が未登録(NULL)の場合に「未登録」と表示します。
sample_coalesce_nullif.sql
SELECT name,
COALESCE(phone, '未登録') AS phone
FROM members;
+------------+---------------+ | name | phone | +------------+---------------+ | 綾波レイ | 090-1234-5678 | | 碇シンジ | 未登録 | | 惣流アスカ | 03-9876-5432 | | 渚カヲル | 未登録 | +------------+---------------+ 4 rows in set
ニックネームがあればニックネームを、なければ本名を表示します。
sample_coalesce_nullif.sql
SELECT COALESCE(nickname, name) AS display_name FROM members;
+--------------+ | display_name | +--------------+ | 綾波レイ | | シンちゃん | | 惣流アスカ | | 渚カヲル | +--------------+ 4 rows in set
nicknameが空文字列の場合に NULL を返してニックネーム未設定として扱います。
sample_coalesce_nullif.sql
SELECT name,
NULLIF(nickname, '') AS nickname
FROM members;
+------------+------------+ | name | nickname | +------------+------------+ | 綾波レイ | NULL | | 碇シンジ | シンちゃん | | 惣流アスカ | NULL | | 渚カヲル | NULL | +------------+------------+ 4 rows in set
IFNULL でニックネームが NULL の会員に「未設定」を表示します(MySQL)。
sample_coalesce_nullif.sql
SELECT name,
IFNULL(nickname, '未設定') AS nickname
FROM members;
+------------+------------+ | name | nickname | +------------+------------+ | 綾波レイ | 未設定 | | 碇シンジ | シンちゃん | | 惣流アスカ | 未設定 | | 渚カヲル | 未設定 | +------------+------------+ 4 rows in set
データベース別の書き方
『COALESCE』と『NULLIF』は標準SQLで定義されており、MySQL・PostgreSQL・SQLite で共通して使用できます。
SELECT COALESCE(phone, '未登録') AS phone FROM members; SELECT NULLIF(nickname, '') AS nickname FROM members;
NULL 置換の簡略構文はデータベースごとに異なります。MySQL は『IFNULL』を使います。
-- MySQL: IFNULL を使います。 SELECT name, IFNULL(nickname, '未設定') AS nickname FROM members;
移植性を考慮する場合は、データベース固有の関数ではなく標準SQLの『COALESCE』を使うことを推奨します。
概要
『COALESCE』は標準SQLで定義されており、MySQLでもPostgreSQLでも動作します。引数を3つ以上指定できるため、「ニックネームがなければ本名、本名もなければ『名無し』」のような優先順位付きのフォールバック処理を一行で書けます。
『NULLIF』は主にゼロ除算の回避に使われます。例えば『total / NULLIF(count, 0)』とすることで、countが0のときにエラーではなくNULLが返るようになります。
NULLの存在確認には『IS NULL / IS NOT NULL』を、条件による値の切り替えには『CASE』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。