NVL, NVL2 ファンクション解説

Oracle Master Silver

OracleデータベースでNULL値を扱う際、NULL値が算術式に与える影響を理解することは非常に重要です。NULLを効率的に処理するNVLNVL2ファンクションを活用することで、予期せぬ結果を回避できます。本記事では、NULL値が算術式に与える影響とその対処法を詳しく解説し、サンプルデータを使った実例も紹介します。


1. サンプル表の作成とデータ挿入

この記事で使用するサンプル表EMPLOYEE_DATAを以下のSQLで作成し、データを挿入します。この表には、社員のID、名前、給与(SALARY)、ボーナス(BONUS)が含まれます。

表作成SQL

CREATE TABLE EMPLOYEE_DATA (
EMP_ID NUMBER PRIMARY KEY, -- 社員ID
EMP_NAME VARCHAR2(50), -- 社員名
SALARY NUMBER, -- 給与
BONUS NUMBER -- ボーナス
);

データ挿入SQL

以下のデータを挿入し、NULL値を含むサンプルを作成します。

INSERT INTO EMPLOYEE_DATA VALUES (1, 'Alice', 5000, 300);
INSERT INTO EMPLOYEE_DATA VALUES (2, 'Bob', NULL, 200);
INSERT INTO EMPLOYEE_DATA VALUES (3, 'Charlie', 4000, NULL);
INSERT INTO EMPLOYEE_DATA VALUES (4, 'Diana', NULL, NULL);
INSERT INTO EMPLOYEE_DATA VALUES (5, 'Eve', 6000, 400);
INSERT INTO EMPLOYEE_DATA VALUES (6, 'Frank', NULL, 100);

データ確認SQL

SELECT * FROM EMPLOYEE_DATA;

実行結果

EMP_IDEMP_NAMESALARYBONUS
1Alice5000300
2BobNULL200
3Charlie4000NULL
4DianaNULLNULL
5Eve6000400
6FrankNULL100

2. NULL値と算術式の関係

NULL値の特性

Oracleでは、NULLを含む演算結果は常にNULLとなります。これが算術式に影響を与え、予期しない結果を引き起こす原因となります。

実例:NULL値の影響を確認する

SELECT EMP_ID, EMP_NAME, SALARY + BONUS AS TOTAL_COMPENSATION
FROM EMPLOYEE_DATA;

実行結果

EMP_IDEMP_NAMETOTAL_COMPENSATION
1Alice5300
2BobNULL
3CharlieNULL
4DianaNULL
5Eve6400
6FrankNULL

3. NVLファンクションで算術式の影響を回避

NVLの活用

NULL値を0や他のデフォルト値に置き換えることで、算術式の結果を正常化できます。

使用例1:NULL値を0に置き換えて計算

SELECT EMP_ID, EMP_NAME,
NVL(SALARY, 0) + NVL(BONUS, 0) AS TOTAL_COMPENSATION
FROM EMPLOYEE_DATA;

実行結果

EMP_IDEMP_NAMETOTAL_COMPENSATION
1Alice5300
2Bob200
3Charlie4000
4Diana0
5Eve6400
6Frank100

4. NVL2ファンクションを活用した柔軟な計算

NVL2の活用

NVL2を使うと、NULLか否かで異なる計算を実行できます。

使用例1:ボーナスが存在する場合に追加報酬を加算

SELECT EMP_ID, EMP_NAME,
NVL(SALARY, 0) + NVL2(BONUS, BONUS + 500, 0) AS TOTAL_COMP_WITH_EXTRA
FROM EMPLOYEE_DATA;

実行結果

EMP_IDEMP_NAMETOTAL_COMP_WITH_EXTRA
1Alice5800
2Bob700
3Charlie4000
4Diana0
5Eve6900
6Frank600

5. NULL値を考慮した複雑な算術式

使用例1:NULL値に応じた動的な補正計算

給与がNULLの場合に固定値2000を設定し、ボーナスがNULLの場合はデフォルトで100を加算します。

SELECT EMP_ID, EMP_NAME,
NVL2(SALARY, SALARY * 1.1, 2000) +
NVL2(BONUS, BONUS * 1.5, 100) AS FINAL_COMPENSATION
FROM EMPLOYEE_DATA;

実行結果

EMP_IDEMP_NAMEFINAL_COMPENSATION
1Alice6050
2Bob2300
3Charlie4100
4Diana2100
5Eve6900
6Frank2150

6. ベストプラクティス

NULL値を算術式に影響させないための方法

  1. デフォルト値の設定
    表定義時にデフォルト値を設定してNULL値を抑制します。sqlコードをコピーするCREATE TABLE EMPLOYEE_DATA ( EMP_ID NUMBER PRIMARY KEY, EMP_NAME VARCHAR2(50), SALARY NUMBER DEFAULT 0, BONUS NUMBER DEFAULT 0 );
  2. NVL/NVL2の活用
    レポートやビューでNULL値を意識的に処理し、正しい結果を得ます。

7. まとめ

  • NVLはNULL値を指定した値に置き換えます。
  • NVL2はNULLか否かで異なる値を返します。
  • NULL値を含む算術式を適切に処理することで、SQLの品質を向上させることができます。

この記事を参考にして、実際にサンプルデータを使用して試してみてください!ご質問やリクエストがあればお気軽にどうぞ。

[参考]
Oracle Database SQL言語リファレンス 19c

コメント

タイトルとURLをコピーしました