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」の特徴を整理しよう! | アシスト