今回やること
この記事では、NULL を含むデータを用意し、IS NULL、IS NOT NULL、COALESCE を練習します。
NULLは = で比較せず、IS NULL で判定します。
前提条件
- SQLを実行できる学習用データベースがある
SELECTとWHEREの基本を知っている- 本番データではなく練習用テーブルで試す
Step 1: 練習用テーブルを作る
CREATE TABLE profiles (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
nickname TEXT,
bio TEXT,
deleted_at DATE
);
nickname、bio、deleted_at は NULL を許可します。
Step 2: 練習データを入れる
INSERT INTO profiles (id, name, nickname, bio, deleted_at) VALUES
(1, 'Sato', 'sat', 'SQLを勉強中', NULL),
(2, 'Suzuki', NULL, 'データベースが好き', NULL),
(3, 'Tanaka', '', NULL, NULL),
(4, 'Yamada', 'yama', NULL, '2026-02-01'),
(5, 'Kato', NULL, '', NULL);
ここでは、NULL と空文字 '' の両方を入れています。
Step 3: NULLの行を探す
ニックネームが未設定の行を取得します。
SELECT id, name, nickname
FROM profiles
WHERE nickname IS NULL;
この結果には、nickname が本当に NULL の行だけが出ます。空文字の行は含まれません。
Step 4: NULLではない行を探す
SELECT id, name, nickname
FROM profiles
WHERE nickname IS NOT NULL;
この結果には、空文字 '' も含まれます。空文字は NULL ではなく、値が入っている状態だからです。
Step 5: 間違いやすい書き方を確認する
次のSQLは、期待通りに NULL を探せません。
SELECT id, name, nickname
FROM profiles
WHERE nickname = NULL;
NULL は通常の値ではないため、= で比較しません。
= NULL と != NULL は初心者がよく書くミスです。NULL判定は常にISを使います。
Step 6: 空文字とNULLを分ける
空文字だけを探す場合は、通常の比較を使います。
SELECT id, name, nickname
FROM profiles
WHERE nickname = '';
未設定を NULL として扱うか、空文字として扱うかは、設計段階で決めておく必要があります。
Step 7: COALESCEで表示を整える
NULL のままだと画面表示や集計で扱いにくいことがあります。表示用には COALESCE が使えます。
SELECT
id,
name,
COALESCE(nickname, '未設定') AS display_nickname
FROM profiles;
nickname が NULL の場合だけ '未設定' が表示されます。空文字は空文字のままです。
Step 8: 退会していないユーザーを探す
deleted_at が NULL の行を、退会していない状態として扱います。
SELECT id, name, deleted_at
FROM profiles
WHERE deleted_at IS NULL;
退会済みのユーザーは次のように取れます。
SELECT id, name, deleted_at
FROM profiles
WHERE deleted_at IS NOT NULL;
よくあるエラー
| エラー | よくある原因 | 確認すること |
|---|---|---|
| NULLの行が取れない | = NULL と書いている | IS NULL に直す |
| 空文字も未設定扱いにしたい | NULLと空文字を分けていない | nickname IS NULL OR nickname = '' を検討 |
COALESCE が効かない | 空文字をNULLだと思っている | 対象値が本当にNULLか確認 |
| 退会済み判定が逆 | IS NULL / IS NOT NULL の意味を取り違えている | deleted_at の設計を確認 |
まとめ
NULL は IS NULL / IS NOT NULL で判定します。空文字や0とは別物です。表示だけ整えたい場合は COALESCE を使えますが、データ設計としてNULLを許可するかどうかは別に決める必要があります。
参考リソース
- PostgreSQL Comparison Functions and Operators
- PostgreSQL Conditional Expressions
- MySQL Working with NULL Values