CodeGym /コース /SQL SELF /COALESCE()でのNULLの扱い方

COALESCE()でのNULLの扱い方

SQL SELF
レベル 9, レッスン 3
使用可能

今日はまたNULLの扱いについて深掘りして、めっちゃ便利な関数 — COALESCE() を紹介するよ。この関数を使えば、データの中のNULL値をスマートに処理できるんだ。

例えばこんなケースを考えてみて:社員データのテーブルがあって、何人かの社員は給料情報が入ってない。もし全員の給料を増やそうとしたらどうなる?うまくいかないよね。だってNULLと計算はできないからさ。じゃあNULLの給料を0にしたい場合は?ここでCOALESCE()の出番!

COALESCE()は、渡された引数リストの中から最初のNULLじゃない値を返す関数だよ。もし全部NULLだったら、結果もNULLになる。簡単に言うと、「最初に見つかったまともな値ちょうだい!」って感じ。

構文

COALESCE(value1, value2, ..., value_n)

value1, value2, ..., value_nは関数に渡す引数だよ。NULLじゃない最初の値を返してくれる。

COALESCE()の使い方例

いくつか例を見てみよう。

例1: NULLを0に置き換える

例えば、salariesテーブルがあるとする:

id name salary
1 Otto 50000
2 Maria NULL
3 Alex 60000
4 Anna NULL

全員の給料の合計を出したいなら、これは簡単:

SELECT SUM(salary) AS total_salary
FROM salaries;

SUM()関数はNULLを無視するから問題なし。

でも、全員に1000のボーナスをあげて合計を出したい場合は?

SELECT SUM(salary+1000) AS total_salary
FROM salaries;

この場合、結果が変になる。最初からCOALESCEでNULLを0に置き換えた方がいいよ。やり方はこう:

SELECT SUM(COALESCE(salary, 0)) AS total_salary
FROM salaries;

結果:

total_salary
110000

こっちの方が安心だね。

例2: NULLをデフォルト値に置き換える

例えば、studentsテーブルに名前と住所があるとする:

id name address
1 Anna Kanne
2 Peter NULL
3 Lisa Painful
4 Alex NULL

住所がNULLなら「未設定」にしたい:

SELECT name, COALESCE(address, '未設定') AS resolved_address
FROM students;

クエリの結果:

name resolved_address
Anna Kanne
Peter 未設定
Lisa Painful
Alex 未設定

例3: 複数の値を使う場合

時々、NULLを1つの値じゃなくて、いくつかの候補から選びたいこともある。例えば、名前、ニックネーム、どっちもなければ「名無し」を使いたい場合。usersテーブル:

user_id first_name short_name full_name
1 John Jonny Johnny Walker
2 NULL Pete Peter Kamen
3 NULL NULL

クエリ:

SELECT user_id,
       COALESCE(first_name, short_name, '名無し') AS display_name
FROM users;

結果:

user_id display_name
1 John
2 Pete
3 名無し

COALESCE()の実践的な使い方

実際には、COALESCE()はイマイチなデータを扱うときの救世主だよ。

いろんな場面でどう役立つか見てみよう。

例1: テキストフィールドの値を置き換える

元のcustomersテーブル:

id name address
1 Alex Lin 123 Maple St
2 Maria Chi NULL
3 Anna Song 456 Oak Ave
4 Otto Art NULL
5 Liam Park 789 Pine Rd

クエリ:

SELECT name, COALESCE(address, '未設定') AS address
FROM customers;

結果:

name address
Alex Lin 123 Maple St
Maria Chi 未設定
Anna Song 456 Oak Ave
Otto Art 未設定
Liam Park 789 Pine Rd

例2: レポート用データの準備

元のsalesテーブル:

id product price
1 Widget A 100
2 Widget B NULL
3 Widget C 250
4 Widget D NULL
5 Widget E 300

クエリ:

SELECT SUM(COALESCE(price, 0)) AS total_sales
FROM sales;

結果:

total_sales
650

COALESCE()を使う時のよくあるミス

COALESCE()はシンプルで万能っぽいけど、いくつか注意点もあるよ。

データ型の不一致。COALESCE()に渡す引数は、データ型が互換性ある必要がある。例えば、文字列と数字を混ぜるのはダメ。

-- エラー
SELECT COALESCE(salary, '未設定') FROM employees; 
-- salaryは数値フィールド、'未設定'はテキスト。

引数の順番を無視すること。COALESCE()は最初のNULLじゃない値を返すから、引数の順番が超大事だよ。

2
タスク
SQL SELF, レベル 9, レッスン 3
ロック未解除
NULL値をデフォルト値に置き換える
NULL値をデフォルト値に置き換える
2
タスク
SQL SELF, レベル 9, レッスン 3
ロック未解除
NULL値の優先順位付き置換
NULL値の優先順位付き置換
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION