きおくの森

ただの記録

IS NOT NULL演算子をIN句に含めたいときの代替手段【SQL】

  • 課題
    WHERE句に同じカラムの条件を複数指定したいから、IN句を使用したい。
    しかし、IS NOT NULL演算子が条件に含まれていて、IN句が使えなくて困る。
    例( WHERE COL1 = '1234' AND COL1 IS NOT NULL )

  • 解決策
    IS NOT NULLの対象にしたいカラムを等号の左辺と右辺に指定する。
    つまり、課題の例であれば、下記の形にすることで解決できる。

    WHERE COL1 IN ('1234', COL1)

    ⇒ NULLは比較演算子で抽出できず、結果的にNULLを除外することになる。そのため、課題の例と同じ結果が返ってくる。
    逆に言えば、NULLを抽出するにはIS NULL演算子を使用しなければならない。

  • 副次的なメリット
    ✓IS NOT NULL演算子を使わないからパフォーマンスが向上する!
     ※B-Treeインデックス使用時に限る。
    ✓IN句でまとめることによりオプティマイザの評価によるコストが低減できる!

  • 参考サイト

    1)IS NOT NULLの回避方法: その時々

    2)【SQL】IN句まとめ(複数条件や否定)~where in~|sampling2x