IS NULL・IS NOT NULLで未設定の値を調べたい
このページでできること
部署が未設定なら IS NULL、設定済みなら IS NOT NULL を使います。同じ社員6行から取り出す結果を比べます。
SQL例の例
SELECT name, department_id
FROM employees
WHERE department_id IS NULL
ORDER BY id;この例で使うサンプル表を見る共通の架空データと、練習用の表を確認します
全20項目で共通の架空データです。salary は月給(円)。NULL は未設定を表します。結果の小数点以下の表示桁数は実行環境により異なります。
employees
| id | name | department_id | salary |
|---|---|---|---|
| 1 | 佐藤 | 1 | 300000 |
| 2 | 鈴木 | 2 | 400000 |
| 3 | 佐々木 | 1 | 350000 |
| 4 | 高橋 | 2 | 400000 |
| 5 | 田中 | NULL | 250000 |
| 6 | 伊藤 | 3 | NULL |
departments
| id | name |
|---|---|
| 1 | 営業 |
| 2 | 開発 |
| 3 | 人事 |
| 4 | 広報 |
employees.department_id が departments.id に対応します。表は説明用です。このサイト上でSQLは実行しません。
使い方を順番に確認する練習を始めるときは、この手順に沿って進めます
使い方
- 未設定を調べたい列を選ぶ
- department_id IS NULL と書く
- 田中さんの部署が NULL であることを確認する
結果の例
| name | department_id |
|---|---|
| 田中 | NULL |
注意点
PostgreSQLではNULL(未設定)は0や空文字とは別です。空文字の扱いはDB製品で異なります。この例のdepartment_idは数値の列なので、空文字を探す条件にはしません。NULLの判定には = や <> ではなく IS NULL・IS NOT NULL を使います。
未設定・設定済み・誤った比較を同じ6行で確認
設定済みだけ:IS NOT NULLで5行
SELECT name, department_id
FROM employees
WHERE department_id IS NOT NULL
ORDER BY id;部署IDがある5人を表示します。未設定の田中さん1人は除かれます。主例のIS NULL(1行)と合わせると、入力の6人すべてを分けられます。
| name | department_id |
|---|---|
| 佐藤 | 1 |
| 鈴木 | 2 |
| 佐々木 | 1 |
| 高橋 | 2 |
| 伊藤 | 3 |
誤り例:= NULLでは0行になる
-- 未設定を探す目的では誤った条件です
SELECT name, department_id
FROM employees
WHERE department_id = NULL
ORDER BY id;文法エラーではなく、比較結果が不明(unknown)になります。WHEREは真の行だけを残すため、この条件では結果は0行です。NULL同士も = では一致と判定されません。<> NULLも未設定以外を探す条件にはならないので、IS NOT NULLを使います。下の結果表は0行のため見出しだけです。
| name | department_id |
|---|
うまくいかないときに確認するエラーや想定と違う結果が出たときの確認ポイント
うまくいかないとき
= NULL で0行になっても、未設定のデータがないとは判断できません。IS NULL に直して確認します。以下の0行例はPostgreSQLの標準の設定を前提にしています。表名・列名・DB製品も確認してください。
PostgreSQLの構文を基準にしています。MySQL・SQL Server・SQLiteなどでは、一部の構文や挙動が異なります。