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をどう扱うかをちゃんと明記して、同僚と誤解がないようにしよう。
こういう知識があれば、正しいクエリが書けるだけじゃなくて、面接でも一目置かれるよ。リアルなデータを扱える力は、ただの理論よりずっと価値があるからね!
GO TO FULL VERSION