SQLのNVL関数とは?
SQLはリレーショナルデータベース管理システム(RDBMS)で用いられるデータベース操作言語です。データベース操作言語とは、データの操作や定義を行う言語を指します。
SQLのNVL関数とはNull Value Logicの略で、NULL値を別の値に変換する関数です。NULL値とはNULLが入っているわけではなく、値が入っていないことを指します。
NVLの使い方は?
NVL関数はOracleが独自実装した関数で、Oracleのみで利用できます。 構文: NVL(expr 1, expr 2) expr 1 NULLかどうかを調べる値を代入します。 expr 2 expr 1がNULLの場合に返す値を指定します。データ型はexpr 1と同じ型に揃えます。 用法: SELECT NVL(カラム名, ‘置き換える値’) FROM テーブル名;
NVLの引数は文字列なため、数値がNULLがどうか確認したい場合はTO_CHAR関数を使用します。 構文: NVL(TO_CHAR(expr1),expr2) 用法: SELECT NVL(TO_CHAR(カラム名,書式), ‘置き換える値’) FROM テーブル名;
NVLとNVL2の違いは?
NVL関数とNVL2関数はOracleが独自実装した関数なため、共にOracleのみで利用できます。ここでは、NVL2関数の使い方とNVLとの違いを見ていきます。 構文: NVL2(expr 1, expr 2, expr 3) expr 1 NULLかどうかを調べる値を代入します。 expr 2 expr 1がNULL以外の場合に返す値を指定します。データ型はexpr 1と同じ型に揃えます。 expr 3 expr 1がNULLの場合に返す値を指定します。データ型はexpr 1と同じ型に揃えます。 用法: SELECT NVL2(カラム名, ‘NULL以外のとき置き換える値’, ‘NULLのとき置き換える値’) FROM テーブル名;
NVL関数とNVL2関数との違いはすでにお気づきの通り引数が追加されていることです。引数の違いはNVL2関数では第2引数にNULL以外の場合に返す値を指定できます。
NVLとCOALESCEの違いは?
ここまでNVL関数について説明しました。NVL関数はOracleが独自実装した関数なため、Oracle以外のRDBMSでは利用することができません。
ここでは、COALESCE関数について説明していきます。COALESCEは英語の「合体する」が由来で、読み方はコウアレスです。COALESCE関数はOracleをはじめ、MySQL・PostgreSQL・SQLServerで利用可能な共通仕様の関数です。したがって各種RDBMSで汎用的に利用するSQL文を作成する際には、COALESCE関数をおすすめします。 構文: COALESCE(expr 1, expr 2) expr 1 NULLかどうかを調べる値を代入します。 expr 2 expr 1がNULLの場合に返す値を指定します。データ型はexpr 1と同じ型に揃えます。 用法: SELECT COALESCE(カラム名, '置き換える値') FROM テーブル名;
NVLを各RDBMSで利用するには
NVL関数はOracleが独自実装した関数なため、Oracle以外のRDBMSでは利用することができません。
COALESCE関数はOracleをはじめ、MySQL・PostgreSQL・SQLServerで利用可能な共通仕様の関数です。したがって、各種RDBMSで汎用的に利用するSQL文を作成する際にはCOALESCE関数をおすすめします。
さらに、COALESCE関数では複数の引数のNULL値の判断を行うことができます。NVL関数と同じ使い方という訳ではありませんが、参考情報として記載しておきます。 構文: COALESCE(expr 1, expr 2, …, expr n) expr 1 NULLかどうかを調べる表現式を代入します。 NULL以外の場合、その値を返します。NULLの場合はexpr 2を評価します。 expr 2 NULLかどうかを調べる表現式を代入します。 NULL以外の場合、その値を返します。NULLの場合は次の表現式を評価します。 : expr n expr 1からexpr n-1までが全てNULLの場合に返す値を指定します。データ型はexpr 1と同じ型に揃えます。
NVLをSQLServerで使うには?
NVL関数をSQLServerで使うにはCOALESCE関数の他、ISNULL関数が利用できます。 構文: ISNULL(expr 1, expr 2) expr 1 NULLかどうかを調べる値を代入します。 expr 2 expr 1がNULLの場合に返す値を指定します。データ型はexpr 1と同じ型に揃えます。 用法: SELECT ISNULL(カラム名, '置き換える値') FROM テーブル名;
NVLをMySQLで使うには?
NVL関数をMySQLで使うにはCOALESCE関数の他、IFNULL関数が利用できます。 構文: IFNULL(expr 1, expr 2) expr 1 NULLかどうかを調べる値を代入します。 expr 2 expr 1がNULLの場合に返す値を指定します。データ型はexpr 1と同じ型に揃えます。 用法: SELECT IFNULL(カラム名, '置き換える値') FROM テーブル名;
NVLをPostgreSQLで使うには?
PostgreSQLではNVL関数に相当する独自実装の関数はありません。そのため、NVL関数をPostgreSQLで使うにはCOALESCE関数を利用します。COALESCE関数は共通仕様なため、Oracle・MySQL・PostgreSQL・SQLServer共通で利用できるメリットがあります。
NVL2を各DBMS利用するには?
NVL2関数はOracleが独自実装した関数です。そのためOracle以外のRDBMSでは利用することができません。Oracle以外でNVL2関数に相当する処理を行う際にはCASE式を用います。
CASE式の構文は以下の通りです。 構文: CASE expr WHEN comparison_expr1 THEN return_expr1 WHEN comparison_expr2 THEN return_expr2 [WHEN comparison_exprn THEN return_exprn ...] [ELSE return_default] END expr 評価する表現式 comparison_expr1/2/,,n exprと比較する表現式 return_expr1/2/,,n 真偽判定で真(TRUE)の場合返す値 return_default 真偽判定で偽(FALSE)の場合返す値
ここでNVL2関数の処理を振り返ってみます。NVL2関数の構文と用法は以下の通りです。 構文: NVL2(expr 1, expr 2, expr 3) expr 1 NULLかどうかを調べる値を代入します。 expr 2 expr 1がNULL以外の場合に返す値を指定します。データ型はexpr 1と同じ型に揃えます。 expr 3 expr 1がNULLの場合に返す値を指定します。データ型はexpr 1と同じ型に揃えます。 用法: SELECT NVL2(カラム名, ‘NULL以外のとき置き換える値’, ‘NULLのとき置き換える値’) FROM テーブル名;
NVL2関数をCASE式で実装するには、IS NOT NULL演算子とIS NULL演算子を利用します。最初にIS NOT NULL演算子とIS NULL演算子の一般用法を説明します。 用法: SELECT 抽出カラム CASE WHEN カラム名 IS NULL THEN ‘NULLのとき置き換える値’ WHEN カラム名 IS NOT NULL THEN ‘NULL以外のとき置き換える値’ END FROM テーブル名
ここでNVL2関数をCASE式で実装するには、ELSEとIS NOT NULL演算子だけでも同等の処理が行えます。具体的には、WHENでIS NOT NULL演算子の真偽が真(TRUE)の場合はNULLではないので、‘NULL以外のとき置き換える値’を返します。ELSEは上記以外なため、NULLが該当します。そのため戻り値は‘NULLのとき置き換える値’とします。 用法: SELECT 抽出カラム CASE WHEN カラム名 IS NOT NULL THEN ‘NULL以外のとき置き換える値’ ELSE ‘NULLのとき置き換える値’ END FROM テーブル名
ここでIS NOT NULL演算子ではなくIS NULL演算子の場合、‘NULLのとき置き換える値’を返し、ELSEで‘NULL以外のとき置き換える値’を返す場合も同等の処理となります。
SQLのNVLで抽出データを整理しましょう
個人で管理するデータベースであればNULL値があったとしても「NULL」と表示されるだけなため影響がありません。しかしながら、企業のシステムやアンケートシステムであれば顧客情報の住所・電話番号・性別等は抜け漏れが多数あります。そのため、単に「NULL」と表示されるよりは「記載なし」とか「不明」などの方が分かりやすく親切です。
NVL関数が理解できたところで、ぜひデータベースの抽出データに活用することをおすすめします。抽出データを整理することで分かりやすい集計結果が得られますので、ぜひお試しください。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから