Loading
  • LIGHT

  • DARK

ROUTE

ルートゼロの
アクティビティ

SQL NULL完全攻略|IS NULL・COALESCEの使い分けとDB別バグ防止術5選

3

SQLのNULLがハマる理由と正しい使い分け

SQL を書いていて、「あれ、データが返ってこない?」そんな経験、私たちはよくあります。とくに
NULL が絡むと、一見正しく見えるクエリでも動きが止まることがあります。
たとえば JOIN した行が急に欠ける
= NULL と書いたら まったく一致しない
クラウド DWH に移行した瞬間に COALESCE の挙動が変わる──。
どれも珍しくありません。
NULL は「値がない」という単純な存在に見えて、その裏側では 3値論理(TRUE / FALSE / UNKNOWN) が働き、私たちが意図しない結果を生みます。
本記事では、IS NULL/= NULL/COALESCE を中心に、よくあるハマり方を整理しながら、実務で安全に書けるクエリ設計をまとめます。
現場で同じ悩みにぶつかったとき、迷わず前に進めるはずです。

(SQLの基本や実践的な使い方については『初心者向けSQL講座|SELECT文の書き方と実行順を完全解説』もご参照ください)

用語解説:SQL
データベースを操作するための言語。データの検索・更新・削除などを行う。

用語解説:NULL
値が未定義・存在しないことを示す特別な値。空文字や0とは異なる。

用語解説:JOIN
複数のテーブルを結合し、関連するデータをまとめて取得するSQLの機能。

用語解説:COALESCE
複数の値のうち、最初にNULLでない値を返すSQL関数。NULL置換に使う。

用語解説:DWH(データウェアハウス)
大量データを蓄積・分析するための専用データベース。

用語解説:3値論理
TRUE(真)・FALSE(偽)・UNKNOWN(不明)の3つで論理判定する仕組み。NULLが絡むとUNKNOWNになる。


1. SQLのNULLがハマる3つの理由

1-1. NULLは“Unknown”を持つ特別な値

NULL は「値が存在しない/不明」を表します。そのため比較結果は TRUE / FALSE / UNKNOWN の三択になります。
たとえば次の比較はすべて UNKNOWN です。

SELECT * FROM t WHERE col = NULL;

UNKNOWN は WHERE 句で除外されるため、一致しないのではなく、“評価不能”として弾かれるのがポイントです。

用語解説:WHERE句
SQLで条件を指定し、必要なデータだけを抽出するための記述。

用語解説:UNKNOWN
NULLとの比較結果として返る「不明」状態。TRUEでもFALSEでもない。

1-2. 空文字・0・FALSEと根本的に違う

NULL は「未定義」の状態です。
以下の値とは意味が異なります。

  • 空文字:''(値はある)
  • 0:数値としてのゼロ(値はある)
  • FALSE:論理値(値はある)

この違いを混同すると、NULL のまま比較が動かない問題に直面しやすくなります。

用語解説:空文字
文字列型で値が空(”)の状態。NULLとは異なり「値が存在する」扱い。

用語解説:FALSE
論理値の「偽」。条件判定で使われる。

1-3. JOIN・集計で“気づかぬ抜け”が起きやすい

外部結合では一致しない行に 必ず NULL が入るため、後続処理でトラブルが起きがちです。

  • LEFT JOIN:右側の欠損がすべて NULL
  • GROUP BY:NULL を含む集計は想定外の値になることがある
  • WHERE:NULL を含む比較は UNKNOWN → 行が抜ける

こうした「仕様としての罠」が、私たちを迷わせる原因です。

(JOINの種類や実践例については『SQL JOINの基本から実践まで|INNER・LEFT・RIGHT・OUTER JOINの違いをわかりやすく解説』もご参照ください)

用語解説:LEFT JOIN
左側のテーブルの全行と、右側の一致する行を結合。右側に一致しない場合はNULLになる。

用語解説:GROUP BY
データを指定した列ごとにグループ化し、集計するSQLの機能。


2. IS NULL/= NULL/COALESCEの正しい使い分け

2-1. NULL判定は必ず IS NULL

最も安全な書き方はこれです。

SELECT * FROM users WHERE deleted_at IS NULL;

= NULL は比較不可で UNKNOWN になります。

-- ❌ これは常に一致しない
SELECT * FROM users WHERE name = NULL;

NULL を扱う場面では、IS NULL / IS NOT NULL が絶対ルールと覚えておくと安全です。

用語解説:IS NULL / IS NOT NULL
値がNULLかどうかを判定するSQLの構文。NULL比較は必ずこれを使う。

2-2. NULLを置換したいときの関数の選び方

用途別に使い分けます。

  • COALESCE:ANSI標準。複数引数に対応
  • ISNULL:SQL Server
  • IFNULL:MySQL
  • NVL:Oracle

もっとも汎用性が高いのは COALESCE です。

SELECT COALESCE(phone, '') AS phone_number 
FROM customers;

複数 DB をまたぐ環境では特に重宝します。

(COALESCEやサブクエリ・JOINの違いについては『SQLサブクエリは遅い?JOIN・CTEとの違いと高速化のベストプラクティス』もご参照ください)

用語解説:ANSI標準
SQLの国際標準規格。多くのDBで共通して使える。

用語解説:ISNULL / IFNULL / NVL
DBごとに用意されたNULL置換関数。ISNULLはSQL Server、IFNULLはMySQL、NVLはOracleで使う。


3. DB別に違うNULLの挙動(RDBMS/DWH)

3-1. PostgreSQL:標準実装で扱いやすい

COALESCE をそのまま使え、挙動も標準SQLに近いです。

用語解説:PostgreSQL
オープンソースの高機能なRDBMS。標準SQLに忠実で、COALESCEなどもそのまま使える。

3-2. MySQL:空文字とNULLが混ざりやすい

前処理の段階で「空文字だと思ったら NULL だった」というケースが多いため、比較・JOINに注意が必要です。

用語解説:MySQL
世界的に利用されているオープンソースRDBMS。空文字とNULLの扱いに注意が必要。

3-3. Oracle:空文字をNULLとして扱う

文字列 ''自動で NULL に変換される仕様があります。
WHERE 条件や COALESCE の判定結果が他 DB と変わる原因です。

用語解説:Oracle
企業向けに広く使われる商用RDBMS。空文字を自動的にNULLとして扱う独自仕様がある。

3-4. BigQuery/Snowflake:型推論の違いに注意

クラウド DWH では、関数の評価順や戻り値の型がオンプレ RDBMS と異なることがあります。
移行時に「同じクエリが突然動かない」という報告が出るのはこのためです。

用語解説:BigQuery
Googleが提供するクラウド型DWH。SQLライクなクエリで大量データを高速処理できる。

用語解説:Snowflake
クラウドベースのDWHサービス。型推論や関数の挙動が他DBと異なる場合がある。

用語解説:型推論
データ型を自動的に判定する仕組み。DBごとに挙動が異なることがある。


4. NULLを前提にしたクエリ設計(ベストプラクティス)

私たちの現場で共有している、シンプルで強力なルールです。

4-1. WHERE/JOINは“NULL前提”で組み立てる

-- LEFT JOINで必ずNULLを考慮
SELECT u.id, COALESCE(p.name, '') 
FROM users u 
LEFT JOIN profiles p ON u.id = p.user_id;

外部結合は NULL が入りやすいため、COALESCE とセットで安全性が高まります。

用語解説:外部結合
LEFT JOINやRIGHT JOINなど、結合条件に一致しない場合でも片方のテーブルの全行を取得する方法。

4-2. 集計前にNULLを適切に処理する

NULL をそのまま集計すると「計算したのに値が返らない」状態が起きます。

SELECT SUM(COALESCE(amount, 0)) FROM payments;

事前に置換しておくことで結果が明瞭になります。

用語解説:SUM関数
指定した列の合計値を計算するSQL関数。NULLがあると合計に含まれないため注意。

4-3. テーブル設計段階でNULL思想を揃える

  • NULL を許容する理由
  • NOT NULL にしたい列
  • デフォルト値の方針

これをドキュメント化しておくと、チーム全体の書き方が統一されます。

用語解説:NOT NULL
その列に必ず値が入るよう制約をかけるSQLの指定。NULLを許容しない。

用語解説:デフォルト値
新規レコード作成時に自動で入る初期値。NULL回避や運用統一に役立つ。


5. 移行・統合でNULLが壊れやすい3ポイント

5-1. 型の違いからNULLが混入する

DB 間移行で文字列型が変わると、空文字→NULL へ変換されることがあります。

用語解説:型変換
データ型を別の型に変換すること。移行時にNULLが混入しやすい。

5-2. ETL/ELT工程で意図しない置換が起きる

NULL を空文字や0に誤変換すると、後続処理で意味が変わります。

用語解説:ETL/ELT
データ抽出・変換・格納(ETL)、または抽出・格納後に変換(ELT)する工程。NULLの扱いに注意。

5-3. 既存クエリの書き方が通用しない

COALESCEISNULL の扱いが違うため、移行後にロジックエラーが生まれやすい部分です。

(SQLエラーの原因や対策については『SQL Syntax Errorの原因と対処チェックリスト|今すぐ試せるエラー解決法』もご参照ください)

用語解説:ロジックエラー
プログラムやクエリの設計ミスによる意図しない動作。NULLの扱い違いで発生しやすい。


まとめ:NULLは敵ではなく“仕様”。理解すれば強力な武器になる

NULL は複雑ではありますが、仕様を理解すれば確実に扱えるようになります。

  • NULL は Unknown を含む三値論理
  • 判定は IS NULL が絶対
  • 置換は COALESCE が最も汎用
  • DB ごとの違いを把握しておく
  • NULL 前提でクエリを設計する

どれも特別なテクニックではなく、現場で役立つ基本です。
ぜひ、お手元のクエリでも動作を試してみてください。

もっとルートゼロを知りたいなら

DISCOVER MORE