データベースを扱う際、NULL 値は避けて通れない存在です。NULL は「値が存在しない」ことを意味し、数値の計算や文字列の結合時に思わぬ動作を引き起こすことがあります。
例えば、以下のような計算を行うと、意図しない結果になることがあります。
SELECT 100 + NULL FROM dual; -- 結果は NULLまた、検索条件においても NULL が含まれると、想定したデータが取得できない場合があります。
SELECT * FROM users WHERE name = NULL; -- データは取得されないこのような問題を回避するために、Oracle では NULL 値を別の値に置き換えるための関数が用意されています。本記事では、代表的な NVL、NVL2、COALESCE、CASE を使った方法について解説します。
NULL値を置き換える関数
Oracleでは、NULL 値を別の値に置き換えるために、いくつかの関数が用意されています。ここでは、代表的な NVL、NVL2、COALESCE、CASE文 を使った方法を紹介します。
NVL関数
NVL 関数は、NULL の場合に指定した値を代わりに返します。シンプルで使いやすいため、NULL値の置き換えで最もよく使用される関数の1つです。
NVL(値, 置き換える値)値:NULLかもしれない値置き換える値:値がNULLだった場合に返す値
使用例
SELECT NVL(NULL, 'デフォルト値') FROM dual;実行結果
デフォルト値NVL2関数
NVL2 は、NVL より少し高度な処理ができます。対象の値が NULLでない場合 と NULLの場合 で異なる値を返すことができます。
NVL2(値, 非NULL時の値, NULL時の値)値:NULLかもしれない値非NULL時の値:値がNULLでない場合に返す値NULL時の値:値がNULLだった場合に返す値
使用例
SELECT NVL2(NULL, '値あり', '値なし') FROM dual;実行結果
値なしCOALESCE関数
COALESCE は、複数の値の中から 最初にNULLでない値 を返します。NVL の拡張版のようなものです。
COALESCE(値1, 値2, ..., 値N)値1, 値2, ..., 値N:左から順に評価され、最初にNULLでない値を返す
使用例
SELECT COALESCE(NULL, NULL, '最初の非NULL値', '次の値') FROM dual;実行結果
最初の非NULL値CASE文を使ったNULL値の置き換え
CASE 文を使えば、より柔軟なNULL値の処理が可能です。他の関数では対応しにくい複雑な条件分岐を設定できます。
CASE
WHEN 値 IS NULL THEN 置き換える値
ELSE 値
END使用例
SELECT
CASE WHEN NULL IS NULL THEN '代替値' ELSE '元の値' END
FROM dual;実行結果
代替値まとめ
本記事では、OracleでNULL値を別の値に置き換えるための方法として、NVL、NVL2、COALESCE、CASE文 を紹介しました。
各関数の違いと使い分け
| 関数名 | 主な用途 | 特徴 |
|---|---|---|
| NVL | シンプルなNULL置き換え | NULL時に指定した値を返す |
| NVL2 | NULLかどうかで異なる値を返す | NULLでない場合とNULLの場合で異なる値を指定可能 |
| COALESCE | 複数の値の中で最初の非NULLを取得 | 複数の候補から最初のNULLでない値を返す |
| CASE文 | 柔軟な条件分岐が可能 | NULLに限らず、さまざまな条件を指定できる |
実務での活用ポイント
- 単純にNULLを特定の値に変えたい場合 →
NVLを使う - NULLと非NULLで異なる処理をしたい場合 →
NVL2を使う - 複数のカラムの値をチェックしながらNULLを補完したい場合 →
COALESCEを使う - 複雑な条件分岐をしたい場合 →
CASEを使う
パフォーマンスの考慮
NVLやCOALESCEは比較的軽量な処理であるため、日常的なデータ処理での使用に適しています。CASE文はより柔軟な処理が可能ですが、長くなると可読性が落ちるため、シンプルな置き換えならNVLやCOALESCEを優先するとよいでしょう。
NULLの扱いはデータベース設計やSQLの処理において非常に重要です。今回紹介した関数を適切に使い分けることで、より堅牢なSQLを記述できるようになります。ぜひ実際の開発やデータ分析に活用してみてください!
コメント