Чарльз почти получил правильный ответ.
Должно быть:
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND (@checked = 0 OR col2 LIKE '%XYZ%')
Это классический «шаблон» в SQL для условных предикатов. Если @checked = 0
, то он вернет все строки, соответствующие остатку предиката (col1 = 'ABC'
). SQL Server даже не обработает вторую половину OR
.
Если @checked = 1
, то он оценит вторую часть OR
и вернет строки, соответствующие col1 = 'ABC' AND col2 LIKE '%XYZ%'
Если у вас есть несколько условных предикатов, их можно объединить в цепочку с помощью этого метода (тогда как методы IF и CASE быстро станут неуправляемыми).
Например:
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND (@checked1 = 0 OR col2 LIKE '%XYZ%')
AND (@checked2 = 0 OR col3 LIKE '%MNO%')
Не используйте динамический SQL, не используйте IF или CASE.