nullifとcoalesce関数の徹底解説と実践活用法

Oracle Master Silver

1. はじめに

Oracleデータベースを扱う上で、NULL値の扱いは避けて通れません。本記事では、NULL値を操作する上で便利な2つの関数、nullifcoalesceについて、その基本から業務での応用までを丁寧に解説します。


2. nullif関数

nullifとは?

nullifは、2つの値が等しい場合にNULLを返し、異なる場合にはそのまま最初の値を返すシンプルな関数です。

図解

値A: 3000   値B: 3000
↓ 等しい場合
結果: NULL

値A: 3000 値B: 2000
↓ 異なる場合
結果: 3000

構文

NULLIF(expr1, expr2)

用途例

  • 重複データを特定し無効化する。
  • デフォルト値を排除する。

実践例: 重複値を排除する

例として、給与(salary)と歩合(commission)が同じ場合に歩合をNULLとして扱います。

SELECT 
emp_id,
emp_name,
salary,
commission,
NULLIF(salary, commission) AS adjusted_commission
FROM
employees;

3. coalesce関数

coalesceとは?

coalesceは、複数の値を順に評価し、最初にNULLでない値を返します。

図解

値A: NULL   値B: 2000   値C: 3000
↓ 最初にNULLでない値を選ぶ
結果: 2000

構文

COALESCE(expr1, expr2, ..., exprn)

用途例

  • デフォルト値の設定。
  • 動的な値の優先順位付け。

実践例: 歩合がない場合の代替値

歩合が設定されていない場合に給与を代わりに使用し、それもNULLなら0を返す例。

SELECT 
emp_id,
emp_name,
salary,
commission,
COALESCE(commission, salary, 0) AS final_value
FROM
employees;

4. サンプル表とデータの準備

以下のSQLを使用して、employees表を作成し、データを挿入してください。

表の作成

CREATE TABLE employees (
emp_id NUMBER,
emp_name VARCHAR2(50),
salary NUMBER,
commission NUMBER
);

データの挿入

INSERT INTO employees (emp_id, emp_name, salary, commission) VALUES (1, 'John', 3000, NULL);
INSERT INTO employees (emp_id, emp_name, salary, commission) VALUES (2, 'Jane', 4000, 500);
INSERT INTO employees (emp_id, emp_name, salary, commission) VALUES (3, 'Alice', NULL, NULL);
INSERT INTO employees (emp_id, emp_name, salary, commission) VALUES (4, 'Bob', 2000, 300);
COMMIT;

5. 実行結果

以下のSQLを実行し、結果を確認してください。

nullifの結果

SELECT 
emp_id,
emp_name,
salary,
commission,
NULLIF(salary, commission) AS adjusted_commission
FROM
employees;
emp_idemp_namesalarycommissionadjusted_commission
1John3000NULL3000
2Jane4000500500
3AliceNULLNULLNULL
4Bob2000300300

coalesceの結果

SELECT 
emp_id,
emp_name,
salary,
commission,
COALESCE(commission, salary, 0) AS final_value
FROM
employees;
emp_idemp_namesalarycommissionfinal_value
1John3000NULL3000
2Jane4000500500
3AliceNULLNULL0
4Bob2000300300

6. 業務での応用例

ケース1: ボーナス計算

ボーナスを給与の10%とするが、歩合がある場合はそれを優先。

SELECT 
emp_id,
emp_name,
COALESCE(commission, salary * 0.1, 0) AS bonus
FROM
employees;

ケース2: 顧客データの整備

連絡先がない場合に「情報なし」と表示。

SELECT 
customer_id,
COALESCE(email, phone, '情報なし') AS contact_info
FROM
customers;

7. 注意点とベストプラクティス

  • nullifの注意点
    NULLが返されると後続の計算でエラーが発生する場合があるため、注意が必要です。
  • coalesceのパフォーマンス
    引数が多い場合、最初にNULLでない値が見つかるまで全て評価されるため、パフォーマンスを考慮する必要があります。

8. まとめ

nullifcoalesceは、データベースにおけるNULL値処理の強力なツールです。これらを適切に活用することで、データの品質向上や業務効率化が可能です。ぜひ、この記事を参考に実践に取り入れてみてください!

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

コメント

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