SQL oracleでnullを比較する際の注意点
Oracleでnullを扱うときに注意する点をまとめました。
イコール(=)ではなくISで比較する
値がnullのデータを取得したいときは、イコール(=)ではなくIS NULLで取得する必要があります。
例えば以下のテーブルで年齢がnullの社員を取得する場合のSQLは以下になります。
| 社員コード | 社員名 | 年齢 |
|---|---|---|
| 1 | テスト社員1 | 42 |
| 2 | テスト社員2 | null |
| 3 | テスト社員3 | 20 |
SELECT 社員コード
FROM 社員マスタ
WHERE 年齢 IS NULL空文字もnullとして扱われる
Oracleでは空文字のデータもnullとして扱われます。
なので、登録時には空文字('')を登録しても、SELECTするときにはカラム = ''ではなく、カラム IS NULLで取得する必要があります。
NOTイコールで注意する
意外と見落としがちな事項です。
例えば退職フラグ(1=退職、以外は在職)のnull許可されているカラムがあり、在職社員を取得したい場合、以下のSQLではnullのデータが正しく取得でしません。
| 社員コード | 社員名 | 退職フラグ |
|---|---|---|
| 1 | テスト社員1 | 1 |
| 2 | テスト社員2 | 0 |
| 3 | テスト社員3 | null |
SELECT 社員コード
FROM 社員マスタ
WHERE 退職フラグ <> 1退職フラグ <> 1では退職フラグがnullのデータが取得されません。
nullも含めて取得する場合は、NVL関数などでnullを0に置き換えるなどの処理が必要になります。
SELECT 社員コード
FROM 社員マスタ
WHERE NVL(退職フラグ,0) <> 1退職フラグにインデックスが張られている場合、NVL関数を使用してしまうと、インデックスが効かなくなってしまいます。
なのでこのような場合はそもそもテーブル設計時にnull許可をしないのがいいかと思います。