【SQL実践|実務向け】【DBAの知恵袋】NULL判定の落とし穴:IS NULL句の正しい使い方

1. 導入:なぜIS NULL句が重要なのか

データベース運用において、データの「未入力」や「不明」を表現するNULLは非常に重要ですが、初心者が最も陥りやすい落とし穴の一つでもあります。多くの開発者が「カラム == NULL」のような比較演算子を使ってしまい、結果が返ってこないというトラブルに直面します。本記事では、SQLiteを例に、NULLを正確に扱うためのIS NULL句の正しい実装方法を解説します。

2. 基礎知識:NULLとは何か

SQLにおけるNULLは「値が存在しない状態」を指し、「0」や「空文字(”)」とは明確に区別されます。データベースの比較演算において、NULLは「値」ではないため、等価演算子(=)で比較しても「真(TRUE)」にはならず、結果としてデータが抽出されません。この特殊な性質を理解し、専用のIS NULL句を使うことが、データ抽出の正確性を高める第一歩です。

3. 実装/解決策:IS NULLとIS NOT NULL

NULLを判定するには、IS NULL句を使用します。逆に、NULL以外のデータ(値が入っているデータ)を取得したい場合は、IS NOT NULL句を使用します。これらは検索条件を指定するWHERE句と組み合わせて利用します。

4. サンプルプログラム

以下のコードをコピーして、SQLite環境で実行してみてください。NULL判定の挙動の違いが明確に確認できます。

— テーブル作成
CREATE TABLE user(id INTEGER, name TEXT, address TEXT);

— サンプルデータの挿入(addressがNULLのレコードを作成)
INSERT INTO user VALUES(1, ‘Honda’, ‘Tokyo’);
INSERT INTO user(id, name) VALUES(2, ‘Katou’); — addressは自動的にNULL
INSERT INTO user VALUES(3, ‘Suzuki’, ‘Osaka’);
INSERT INTO user(id, name) VALUES(4, ‘Toda’); — addressは自動的にNULL

— 【正解】IS NULLを使って住所が不明のユーザーを取得
SELECT FROM user WHERE address IS NULL;

— 【正解】IS NOT NULLを使って住所が登録されているユーザーを取得
SELECT FROM user WHERE address IS NOT NULL;

— 【注意】以下のコードは結果が0件になります(よくある間違い)
— SELECT FROM user WHERE address = NULL;
— SELECT FROM user WHERE address = ”;

5. 応用・注意点:現場でのトラブル回避

現場でよくあるミスは、外部システムから受け取った空文字をNULLと混同してしまうケースです。
NULLと空文字は別物であることを常に意識してください。もし「NULLまたは空文字」の両方を検索対象にしたい場合は、以下のようにOR演算子を組み合わせる必要があります。

SELECT FROM user WHERE address IS NULL OR address = ”;

また、大規模なテーブルで頻繁にNULLを検索対象にする場合は、関数インデックスや、NULL値を特定のデフォルト値に置き換えてインデックスを貼るなどの最適化を検討してください。NULLの扱いはパフォーマンスにも影響するため、設計段階で「値がNULLになる可能性があるか」を常に考慮することが、優秀なDBAへの近道です。

コメント

タイトルとURLをコピーしました