CodeGym /コース /SQL SELF /実際の課題でのNULLの扱い例:計算、フィルタリング、ソート

実際の課題でのNULLの扱い例:計算、フィルタリング、ソート

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

NULLの扱いは、レポートでデータが抜けてる時の処理から、フィルタやソートまで、いろんな場面で出てくるよ。もしテーブルに値がない場合と、9999みたいな変な数字を入れる場合を選べるなら、ほとんどの人はNULLを選ぶと思う。まあ、便利とは言えないけど、正直だよね。いくつか典型的なケースを見てみよう。

例:値段がない商品のソート

ネットショップを運営してるとして、商品テーブルがあるとするよ:

product_id name price
1 スマホ 45000
2 ノートパソコン NULL
3 カメラ 25000
4 スマートウォッチ NULL

商品を値段順にソートしたいけど、値段がない(NULL)商品は最後にしたい。

SELECT product_id, name, price
FROM products
ORDER BY price ASC NULLS LAST;

結果:

product_id name price
3 カメラ 25000
1 スマホ 45000
2 ノートパソコン NULL
4 スマートウォッチ NULL

NULLS LASTっていうキーワードに注目してね。PostgreSQLだと、ASCの場合はデフォルトでNULLが最初に来るけど、このパラメータを付けると最後にできるよ。

例:誕生日が未入力の学生のフィルタ

学生テーブルがあって、誕生日が入力されてない人だけ選びたいとき。

student_id name birth_date
1 Otto Art 2000-01-15
2 Anna Song NULL
3 Alex Lin 1999-05-10
4 Maria Chi NULL

クエリ:

SELECT student_id, name
FROM students
WHERE birth_date IS NULL;

結果:

student_id name
2 Anna Song
4 Maria Chi

誕生日が不明な学生の情報をちゃんと引っ張ってこれたね。

NULLを扱う関数の使い方例

例:NULLを考慮した合計金額の計算

注文テーブルに注文金額が入ってるけど、データが全部埋まってるとは限らない。そんな時は金額が0として計算したい。

データ例:

order_id customer_name order_amount
1 Alex 1200
2 Maria 2500
3 Max NULL
4 Xena 3100

クエリ:

SELECT SUM(COALESCE(order_amount, 0)) AS total_amount
FROM orders;

結果:

total_amount
6800

COALESCE(order_amount, 0)でNULLを0に置き換えてから合計してるよ。これでエラーや変な計算を防げる。

例:NULLの代わりにテキストを表示

customer_name order_amount
Alex 1200
Maria 2500
Max NULL
Xena 3100

レポートで、空データにはNULLの代わりに「未入力」と表示したい。

SELECT
    customer_name, 
    COALESCE(order_amount::TEXT, '未入力') AS order_status
FROM orders;

結果:

customer_name order_status
Alex 1200
Maria 2500
Max 未入力
Xena 3100

COALESCE()を使えば、NULLの時に好きなテキストを表示できるよ。

ちょっと複雑なNULLの扱い方

customer_name order_amount
Alex 1200
Maria 2500
Max NULL
Xena 3100

今回の課題は、金額が未入力の注文を最初に、その後は金額が大きい順に並べること。

SELECT customer_name, order_amount
FROM orders
ORDER BY order_amount DESC NULLS FIRST;

結果:

customer_name order_amount
Max NULL
Xena 3100
Maria 2500
Alex 1200

ここではNULLS FIRSTを使って、NULLを一番上に持ってきてるよ。

例:NULL値を置き換えてフィルタする

student_id name birth_date
1 Otto Art 2000-01-15
2 Anna Song NULL
3 Alex Lin 1999-05-10
4 Maria Chi NULL

レポートによっては、値が入ってる行だけ出したり、NULLなら「不明」と表示したい時もあるよ。

SELECT
    student_id, 
    name, 
    COALESCE(birth_date::TEXT, '不明') AS birth_date_info
FROM students;

結果:

student_id name birth_date_info
1 Otto Art 2000-01-15
2 Anna Song 不明
3 Alex Lin 1999-05-10
4 Maria Chi 不明

こういうのは、データが抜けてることをちゃんと見せたいレポートで便利だよ。

実践的なアドバイス

NULLを扱うときは、ちょっと注意が必要。役立つポイントをまとめるね:

  • IS NULLやCOALESCE()で、値が抜けてるかどうかのチェックや置換をしよう。
  • 集計関数はNULLを無視する(COUNT(*)は例外)。
  • ソートの時はNULLS FIRSTやNULLS LASTを忘れずに。
  • レポートでは、NULLをどう扱うかをちゃんと明記して、同僚と誤解がないようにしよう。

こういう知識があれば、正しいクエリが書けるだけじゃなくて、面接でも一目置かれるよ。リアルなデータを扱える力は、ただの理論よりずっと価値があるからね!

2
タスク
SQL SELF, レベル 10, レッスン 3
ロック未解除
NULL値を持つ行のフィルタリング
NULL値を持つ行のフィルタリング
2
タスク
SQL SELF, レベル 10, レッスン 3
ロック未解除
NULLの処理を含む合計金額の計算
NULLの処理を含む合計金額の計算
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION