今日はまた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じゃない値を返すから、引数の順番が超大事だよ。
GO TO FULL VERSION