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
許可をしないのがいいかと思います。