じゃあ、謎のNULLを扱うためのもう一つの関数、NULLIF()について話そう!これは、特定の値をNULLに置き換えてデータをちゃんと処理したいときに役立つんだ。シートベルト締めて、面白い旅に出発しよう!
NULLIF()関数はPostgreSQLでめっちゃ便利なツールで、2つの値を比べて、同じならNULLを返して、違ったら最初の値を返すんだ。まるで「この値が同じなら、もう忘れちゃおう!」って感じ。
シンタックスはこんな感じ:
NULLIF(value1, value2)
value1とvalue2が同じなら、結果はNULL。違ったら、結果はvalue1になるよ。
例:
SELECT NULLIF(10, 10); -- 結果: NULL
SELECT NULLIF(10, 20); -- 結果: 10
SELECT NULLIF('hello', 'hello'); -- 結果: NULL
SELECT NULLIF('hello', 'world'); -- 結果: 'hello'
簡単でしょ?じゃあ、実際の課題でこの関数を使ってみよう。
例1: ゼロ割りエラーの回避
ゼロで割るのはプログラマーの悪夢だよね。SQLでゼロ割りしようとするとエラーになる。ここでNULLIF()が助けてくれる!
例えば、salesテーブルがあって、revenue(収入)とexpenses(支出)の2つのカラムがあるとしよう。支出に対する収益性(revenue / expenses)を計算したいけど、たまに支出がゼロになることがある。そのままクエリを書いたらゼロ割りエラーになるよ。
salesテーブル:
| revenue | expenses |
|---|---|
| 1000 | 200 |
| 1500 | 0 |
| 2000 | 250 |
ダメなクエリ:
SELECT revenue / expenses AS profitability
FROM sales;
-- エラー: ゼロ割り!
NULLIF()を使った解決法:
SELECT revenue / NULLIF(expenses, 0) AS profitability
FROM sales;
結果:
| profitability |
|---|
| 5.00 |
| NULL |
| 8.00 |
これでexpensesが0のとき、NULLIF(expenses, 0)はNULLを返して、NULLで割ってもエラーにならず、結果もNULLになるよ。
例2: 同じ値をNULLに置き換える
例えば、学生データのテーブルがあって、first_nameとpreferred_nameのカラムがあるとしよう。たまに学生は本名をそのまま使うし、たまに違う名前を選ぶ。もし両方同じなら、preferred_nameを表示する意味はないよね。
studentsテーブル:
| first_name | preferred_name |
|---|---|
| John | Johnny |
| Anna | Anna |
| Alex | Lex |
NULLIF()を使ったクエリ:
SELECT first_name,
NULLIF(preferred_name, first_name) AS display_name
FROM students;
結果:
| first_name | display_name |
|---|---|
| John | Johnny |
| Anna | NULL |
| Alex | Lex |
preferred_nameとfirst_nameが同じなら、結果はNULLになるよ。
例3: データのフィルタリング
たまに、2つのカラムの値が違う行だけを選びたいことがある。例えば、注文テーブルにoriginal_priceとdiscounted_priceがあって、割引が適用された注文だけを探したいとき。
ordersテーブル:
| order_id | original_price | discounted_price |
|---|---|---|
| 1 | 100 | 100 |
| 2 | 200 | 180 |
| 3 | 150 | 150 |
NULLIF()を使ったクエリ:
SELECT order_id, original_price, discounted_price
FROM orders
WHERE NULLIF(original_price, discounted_price) IS NOT NULL;
結果:
| order_id | original_price | discounted_price |
|---|---|---|
| 2 | 200 | 180 |
割引があった注文だけが結果に出てくるよ。
NULLIF()の実用ケース
ケース1: オプション値の選択
データを扱うとき、複数のカラムから特定の値を除外して選びたいことがある。例えば、従業員リストがあって、base_salaryとbonusがある。もしボーナスが0なら、999にしたい。
employeesテーブル:
| employee_id | base_salary | bonus |
|---|---|---|
| 1 | 50000 | 10000 |
| 2 | 40000 | 0 |
| 3 | 60000 | 5000 |
NULLIF()を使ったクエリ:
SELECT employee_id,
base_salary + COALESCE(NULLIF(bonus, 0), 999) AS total_salary
FROM employees;
結果:
| employee_id | total_salary |
|---|---|
| 1 | 60000 |
| 2 | 40999 |
| 3 | 65000 |
bonusが0なら、999に変わるよ。
ケース2: 行数のカウント
NULLIF()を使えば、複雑なフィルタ条件もシンプルにできる。例えば、ユーザーテーブルがあって、全体の人数と、guestじゃない登録ユーザー数を一発で知りたいとき。
SELECT
COUNT(*) AS total_users,
COUNT(NULLIF(status, 'guest')) AS registered_users
FROM users;
こんな感じで、NULLIF()一つでいろんな課題が解決できるよ。エラー回避からコードの読みやすさアップまで。これで使い方が分かったら、PostgreSQLでデータを扱うスキルがまた一歩アップだね!
GO TO FULL VERSION