Lv1プログラマの誰得メモ

総務女子の趣味とか勉強に関係することのメモ

【SQL】NOT IN句でひとつでもNULLがあったら空が返ってきてしまう

SQLのNOT IN句について、NOT IN で指定したサブクエリーに NULL が存在すると常に空の結果が返ってきてしまう。 OraclePostgreSQLに限らず標準っぽい?

NOT IN演算子に続くリストの中のいずれかの項目がNULLの場合は、すべての行はFALSEまたは不明(UNKNOWN)と評価されます(行は戻されません)。

IN条件(oracle.com)

SEELCT *
FROM MAIN_HOGE
WHERE M_ID NOT IN ( 
   SELECT S_ID FROM SUB_HOGE 
)

みたいに書くなら ”S_ID” がNULL不可である必要がありそう。
NULL可カラムなら以下↓のような書き方をしてNULL排除するとか。

SEELCT *
FROM MAIN_HOGE
WHERE M_ID NOT IN (
    SELECT S_ID FROM SUB_HOGE WHERE S_ID IS NOT NULL 
)

もしくは以下のように NOT EXISTS を使用するか。

SEELCT *
FROM MAIN_HOGE
WHERE NOT EXITS( 
   SELECT S_ID FROM SUB_HOGE WHERE SUB_HOGE.S_ID = MAIN_HOGE.M_ID 
)

Oracleでは、0バイト文字はNULL扱いなので、SQLを書くときはNULLの取り扱いには十分注意したい。