SQLServer where句をある条件のときだけ有効にする方法

2017.11.26

Transact-SQLで、どうしてもコードでSQLを生成したくないときに使えるテクニック。

例として、何か値を単純に判定するケースと、日付を範囲で判定するケースを書いてみました。

coalesceを使って、値がNULLじゃないときだけ、条件を有効にする

where
    1 = 1
    and coalesce(COL_1,0) = coalesce(@VAL_1,COL_1,0)
    and coalesce(COL_2,0) between
        coalesce(@VAL_START_DATE,COL_2)
        and
        coalesce(@VAL_END_DATE,COL_2)

caseを使って、値がNULLじゃないときだけ、条件を有効にする

caseを使えば、NULL判定以外も可能です。

where
    1 = 1
    and COL_1 = case when @VAL_1 is null then COL_1 else @VAL_1 end
    and COL_2 between coalesce(@VAL_START_DATE,COL_2) and coalesce(@VAL_END_DATE,COL_2)

注意事項

どうしても、コードでSQLを生成したくないときや、SQL単体でどうにかしたいとき以外は使わないの方が良いかもしれません。

インデックスがうまく使えなかったりと、パフォーマンス的に不利になるケースがあります。