Поскольку никакие другие объединения не должны выполняться динамически для проверки значения параметра, который может иметь значение, и единственной динамической частью является предложение WHERE, это также может быть статический запрос, который имеет все возможные параметры. Итак, у вас есть следующие сценарии:
Если вы хотите проверить значения, которые могут быть любыми (отрицательные / нули / нули / положительные / пустые строки / и т. Д.), Необходимо использовать вспомогательный параметр, например @ signifficant_param1, вместе с исходным значением @ param1.
[...]
WHERE
(@signifficant_param1=0 or (@param1 is null and field1 is null) or @param1=field1)
AND (@signifficant_param2=0 or (@param2 is null and field2 is null) or @param2=field2)
//etc
[...]
Это самое универсальное предложение, которое я могу себе представить.
В основном это проверит значение @signifficant_param
. Если этот параметр следует учитывать, он будет равен 1, первая часть условия будет ложной, а вторая часть (проверка параметра) будет иметь место. На втором этапе, если @param
равно нулю, вы ищете все нулевые значения field
и не можете сравнить ноль с нулем, потому что они не равны. Затем происходит проверка правильности совпадения ненулевых значений.
Если, с другой стороны, значения в field
не могут быть нулевыми или не могут быть отрицательными, вам не нужен @signifficant_param
, потому что вы можете создать правило, например, если @param
равно нулю, тогда это значение не имеет значения (в предыдущем случае вам пришлось бы искать все нулевые значения), вы можете использовать следующее:
[...]
WHERE
field1=case when @param1 is null then field1 else @param1 end --first way with case statement
and (@param2 is null or field2=@param2) --second way with boolean logic
[...]