CodeGym /コース /SQL SELF /NULLIF()関数 ― シンタックスと使い方の例

NULLIF()関数 ― シンタックスと使い方の例

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

じゃあ、謎のNULLを扱うためのもう一つの関数、NULLIF()について話そう!これは、特定の値をNULLに置き換えてデータをちゃんと処理したいときに役立つんだ。シートベルト締めて、面白い旅に出発しよう!

NULLIF()関数はPostgreSQLでめっちゃ便利なツールで、2つの値を比べて、同じならNULLを返して、違ったら最初の値を返すんだ。まるで「この値が同じなら、もう忘れちゃおう!」って感じ。

シンタックスはこんな感じ:

NULLIF(value1, value2)

value1value2が同じなら、結果は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_namepreferred_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_namefirst_nameが同じなら、結果はNULLになるよ。

例3: データのフィルタリング

たまに、2つのカラムの値が違う行だけを選びたいことがある。例えば、注文テーブルにoriginal_pricediscounted_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_salarybonusがある。もしボーナスが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でデータを扱うスキルがまた一歩アップだね!

1
アンケート/クイズ
NULLの扱い、レベル 9、レッスン 4
使用不可
NULLの扱い
NULLの扱い
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION