NULLがある場合のSQLのWhere句の条件に注意
OracleのSQLでハマったんで備忘録(というか知らなかっただけ)。
テーブル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でも同じとのことらしい。
どうやら、NULLの比較は、UNKNOWNという状態になるらしい。
なので、NULLを含む「佐藤以外」の行を取得したいのなら、
select * from TBL_A where SEI IS NULL OR SEI <> '佐藤';
としないといけない。