Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
COALESCE / NULLIF
NULL値を別の値に置き換えたり、特定の値をNULLに変換したりする関数です。NULL絡みの処理を簡潔に記述できます。
構文
-- 最初のNULLでない値を返します(標準SQL)。 SELECT COALESCE(値1, 値2, 値3, ...); -- 2つの値が等しければNULLを、異なれば値1を返します(標準SQL)。 SELECT NULLIF(値1, 値2); -- 値がNULLならば代替値を返します(MySQL独自)。 SELECT IFNULL(値, 代替値);
構文一覧
| 構文 | 概要 |
|---|---|
| COALESCE(値1, 値2, ...) | 引数を左から順に評価し、最初のNULLでない値を返します。すべてNULLの場合はNULLを返します。 |
| NULLIF(値1, 値2) | 値1と値2が等しい場合はNULLを返し、異なる場合は値1を返します。ゼロ除算の回避などに使用します。 |
| IFNULL(値, 代替値) | 値がNULLであれば代替値を、NULLでなければ値をそのまま返します(MySQL独自)。COALESCE(値, 代替値) と同義です。 |
サンプルコード
-- 電話番号が未登録(NULL)の場合に「未登録」と表示します。
SELECT name,
COALESCE(phone, '未登録') AS phone
FROM members;
-- ニックネームがあればニックネームを、なければ本名を表示します。
SELECT COALESCE(nickname, name) AS display_name
FROM members;
-- discount が 0 の場合に NULL を返して集計から除外します。
SELECT AVG(NULLIF(discount, 0)) AS avg_nonzero_discount
FROM orders;
-- ゼロ除算を回避して単価あたりの売上を計算します。
SELECT product_name,
total_sales / NULLIF(quantity, 0) AS unit_price
FROM products;
-- IFNULL でポイントが NULL のユーザーに 0 を設定します(MySQL)。
SELECT name,
IFNULL(points, 0) AS points
FROM members;
実行結果
-- SELECT name, COALESCE(phone, '未登録') AS phone FROM members; の結果例 -- +----------+---------------+ -- | name | phone | -- +----------+---------------+ -- | 田中太郎 | 090-1234-5678 | -- | 鈴木花子 | 未登録 | -- | 佐藤一郎 | 03-9876-5432 | -- +----------+---------------+
データベース別の書き方
『COALESCE』と『NULLIF』は標準SQLで定義されており、MySQL・PostgreSQL・Oracle・SQL Server・SQLite で共通して使用できます。
-- 全データベース共通の構文です。 SELECT COALESCE(phone, '未登録') AS phone FROM members; SELECT total_sales / NULLIF(quantity, 0) AS unit_price FROM products;
NULL 置換の簡略構文はデータベースごとに異なります。MySQL は『IFNULL』、Oracle は『NVL』、SQL Server は『ISNULL』を使います。
-- MySQL: IFNULL を使います。 SELECT name, IFNULL(points, 0) AS points FROM members; -- Oracle: NVL を使います。 SELECT name, NVL(points, 0) AS points FROM members; -- SQL Server: ISNULL を使います。 SELECT name, ISNULL(points, 0) AS points FROM members;
移植性を考慮する場合は、データベース固有の関数ではなく標準SQLの『COALESCE』を使うことを推奨します。
概要
『COALESCE』は標準SQLで定義されており、MySQLでもPostgreSQLでも動作します。引数を3つ以上指定できるため、「ニックネームがなければ本名、本名もなければ『名無し』」のような優先順位付きのフォールバック処理を一行で書けます。
『NULLIF』は主にゼロ除算の回避に使われます。例えば『total / NULLIF(count, 0)』とすることで、countが0のときにエラーではなくNULLが返るようになります。
NULLの存在確認には『IS NULL / IS NOT NULL』を、条件による値の切り替えには『CASE』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。