思わぬ集計ミスの原因?SQL ServerのNULLの扱い方と注意点を徹底解説
SQL Serverを使ううえで意外と見落とされがちなのが「NULLの扱い」です。
NULLは「値が存在しない」ことを意味しますが、0 や空文字とは異なる特別な値であり、比較や演算において特別な動作をします。
この記事では、IS NULLによる判定、COALESCE・NULLIFの使い方、および実務での注意点を初心者向けにわかりやすく解説します。
目次
NULLとは?SQLにおける「値なし」の意味
NULLは「未知」や「不明」を意味する
NULLは「データが存在しない」または「値がわからない」状態を示します。
つまり、0 や空文字('')とは異なり、「何も入っていないことを明示する特別なマーカー」です。
| 値 | 意味 |
|---|---|
| 0 | 数値が0として存在する |
| ''(空文字) | 文字列が空として存在する |
| NULL | 値そのものが存在しない(不明) |
NULLを含む比較の結果
NULLは他の値とは比較できません。次の例のように、NULLとの比較は常に「不明(UNKNOWN)」になります。
SELECT CASE WHEN NULL = NULL THEN '同じ' ELSE '異なる' END; -- 結果:異なる
このように、NULL同士であっても「等しい」とは判定されません。
IS NULLとIS NOT NULLでNULLを判定する
NULL判定は「= NULL」ではできない
NULLは通常の比較演算子(=, <>, !=)では判定できません。
NULLを検出するには、必ず IS NULL または IS NOT NULL を使います。
SELECT * FROM Employees
WHERE Department IS NULL;
逆に、部署が登録されている社員を抽出する場合:
SELECT * FROM Employees
WHERE Department IS NOT NULL;
このように、IS NULL/IS NOT NULL はNULL特有の比較方法です。
COALESCE関数でNULLを代替する
COALESCEとは?
COALESCE関数は、複数の引数の中で最初にNULLでない値を返す関数です。
「もしNULLなら別の値を使いたい」というときに便利です。
SELECT COALESCE(PhoneNumber, '未登録') AS Phone
FROM Customers;
上記の例では、電話番号がNULLの行に「未登録」と表示されます。
複数候補を指定できる
引数は2つ以上でもOKです。先に見つかった非NULL値が採用されます。
SELECT COALESCE(AltEmail, Email, 'no-reply@example.com') AS ContactEmail
FROM Users;
NVL(Oracle)と似た機能ですが、SQL標準関数として移植性があります。
NULLIF関数で同一値をNULLとして扱う
NULLIFの基本
NULLIFは、2つの値が等しい場合にNULLを返す関数です。
主に「前後の値が変わっていない場合はNULLとして扱う」といった条件で使われます。
SELECT NULLIF(Price, 0) AS ValidPrice
FROM Products;
Price が 0 の場合、結果は NULL。0でない場合はその値が返されます。
UPDATE文での活用例
同じ値の更新をスキップしたい場合などにも利用できます。
UPDATE Employees
SET Phone = NULLIF(@NewPhone, Phone);
新しい値と現行値が同じなら NULL が設定され、後段のUPDATEトリガーなどを抑制できます。
NULLを含む演算・比較・集計の注意点
数値演算では結果もNULLになる
SELECT 100 + NULL; -- 結果:NULL
NULLが含まれると結果もNULLになるため、COALESCEで代替値を設定するのが実務的です。
集計関数はNULLを無視する
SUMやAVGなどの集計関数は、NULLを自動的に除外して計算します。
SELECT AVG(Salary) FROM Employees; -- NULLの行は除外
COUNT(*) はNULLも含めて行数を数えますが、COUNT(列名) はNULLを除外する点にも注意が必要です。
| 関数 | NULLの扱い |
|---|---|
| COUNT(*) | NULLを含めてカウント |
| COUNT(列名) | NULLを除外 |
| SUM / AVG / MAX / MIN | NULLを除外して計算 |
まとめと次のステップ
学んだ内容の整理
- NULLは「値が存在しない」特別な状態で、0や空文字とは異なる。
- NULL判定はIS NULL/IS NOT NULLを使う。
- COALESCEで代替値を設定し、NULLIFで同値をNULL化できる。
- 集計関数はNULLを除外するため、意図せず平均や件数がずれる可能性に注意。
参考リンク

0 件のコメント:
コメントを投稿