Проблема в том, что CASE
возвращает значение, это не ветвь в логике.Ссылка, которую обеспечивает OMG, в значительной степени является авторитетным источником (почти все, что от Эрланда Соммарского может быть отличным советом).
Краткий обзор ссылки:
Вы можете использоватьдинамический SQL, где вы строите оператор на основе условий.Часто это может быть наилучшим подходом, но есть и недостатки.Один из самых больших недостатков - возможные проблемы безопасности, поэтому убедитесь, что вы полностью понимаете атаки с использованием SQL-инъекций и способы их предотвращения.
Другой подход заключается в использовании сложной логики в выражении WHERE с использованием OR.В вашем случае это будет что-то вроде ниже.Этот подход немного проще, чем динамический SQL, и безопаснее, но производительность не всегда может быть высокой.Если производительность подходит для вашей ситуации, хотя бы (протестируйте ее), то придерживайтесь этого подхода.
SELECT
* -- I assume that you used * just as an example and don't actually use this in your production code
FROM
Bank_Detail
WHERE -- POSSIBLY SOME OTHER WHERE CLAUSES
(@second IS NULL AND X = @first) OR
(@second IS NOT NULL AND (x >= @first AND x <= @second))
-- POSSIBLY SOME MORE WHERE CLAUSES
ORDER BY
x
Другой способ организовать утверждение только что пришел мне в голову ...
SELECT
*
FROM
Bank_Detail
WHERE -- POSSIBLY SOME OTHER WHERE CLAUSES
x >= @first AND
x <= COALESCE(@second, @first)
-- POSSIBLY SOME MORE WHERE CLAUSES
ORDER BY
x
Iеще не проверял, но я думаю, что это будет логически эквивалентно и может дать вам более согласованный план запросов.
Эрланд также предлагает несколько других возможных подходов, поэтому обязательно прочитайте его полную статью опредмет.