CASE в WHERE, SQL Server
Я делаю поиск, где пользователи выбирают в раскрывающемся списке некоторые предложения. Когда они оставляют поле пустым, я хочу, чтобы запрос игнорировал предложение. Я знаю CASE, и лучше всего я подумал, что если я передам 0 в параметр хранимой процедуры, он игнорирует этот параметр, как это.
WHERE a.Country = (CASE WHEN @Country > 0 THEN @Country ELSE (something else) END)
так что (что-то еще) должно быть как никакое условие, оно может быть " > 0", поскольку идентификаторы страны из всех > 1, но я не знаю, как использовать > и = в том же CASE.
Любые предложения?
Ответы
Ответ 1
Несколько способов:
-- Do the comparison, OR'd with a check on the @Country=0 case
WHERE (a.Country = @Country OR @Country = 0)
-- compare the Country field to itself
WHERE a.Country = CASE WHEN @Country > 0 THEN @Country ELSE a.Country END
Или используйте динамически сгенерированный оператор и только при необходимости добавьте в состояние страны. Это должно быть наиболее эффективным в том смысле, что вы выполняете только запрос с условиями, которые действительно должны применяться и могут привести к лучшему плану выполнения, если поддерживаются индексы. Вам нужно будет использовать параметризованный SQL для предотвращения внедрения SQL.
Ответ 2
Вы можете упростить:
WHERE a.Country = COALESCE(NULLIF(@Country,0), a.Country);
Ответ 3
(something else)
должен быть a.Country
если Country
имеет значение NULL, тогда сделайте (something else)
be a.Country OR a.Country is NULL
Ответ 4
.. ELSE a.Country ...
Предположим, что
Ответ 5
Попробуйте следующее:
WHERE a.Country = (CASE WHEN @Country > 0 THEN @Country ELSE a.Country END)