NULLがある場合のSQLのWhere句の条件に注意

OracleSQLでハマったんで備忘録(というか知らなかっただけ)。

テーブルTBL_Aが、

ID SEI MEI
1 鈴木 太郎
2 鈴木 二郎
3 NULL NULL
4 佐藤 一郎

で、SELECT文が

select * from TBL_A where SEI <> '佐藤';

だと結果は以下。

ID SEI MEI
1 鈴木 太郎
2 鈴木 二郎

となり、NULLは「佐藤以外」ではない。ちなみに、

select * from TBL_A where NOT(SEI = '佐藤');

でも結果は同じ。以下のサイトによれば、DB2でも同じとのことらしい。

SQLで特定の文字以外の条件でNULLのレコードが取得されない

どうやら、NULLの比較は、UNKNOWNという状態になるらしい。

NULLの特性

なので、NULLを含む「佐藤以外」の行を取得したいのなら、

select * from TBL_A where SEI IS NULL OR SEI <> '佐藤';

としないといけない。