SQL(Oracle)で「NOT IN」が効かないときの対処方法
NOT INを使っても期待した結果が返ってこない
久々にSQL書いたら軽くはまったのでメモ。
COLUMN_NAME列には基本的にはnull、HOGEの2つしか入っていない。
「HOGE」が入っていない行を取り出したいので以下のようにした。
SELECT * FROM TABEL_NAME WHERE COLUMN_NAME NOT IN 'HOGE'
SELECT * FROM TABEL_NAME WHERE COLUMN_NAME <> 'HOGE'
これを実行すると本来COLUMN_NAME 列に「HOGE」がない(nullが入っている)行が出てきてほしいが、どちらも何も出てこない。
どうやら「COLUMN_NAME 」にnullがある場合、これは機能しないらしい(上司談)。
ということで逆にNULLだけを取り出してみる。
SELECT * FROM TABEL_NAME WHERE COLUMN_NAME IS NULL
まぁ、これはうまくいく。
う~ん。基本的にはnullとHOGEしか入らないはずだけど今後何かしらの変更があったら…と思って変えてみた。
SELECT * FROM TABEL_NAME WHERE (COLUMN_NAME IS NULL OR COLUMN_NAME <> 'HOGE')
これだとFUGAとかが入っていても「COLUMN_NAME <> 'HOGE'」の方で引っかかるのかな?
ところで、OracleではNULLと空白は同じ扱いだそうだ。
SQLの観点から「Oracle Database」「PostgreSQL」「MySQL」の特徴を整理しよう! | アシスト