Подтвердить что ты не робот

CASE в WHERE, SQL Server

Я делаю поиск, где пользователи выбирают в раскрывающемся списке некоторые предложения. Когда они оставляют поле пустым, я хочу, чтобы запрос игнорировал предложение. Я знаю CASE, и лучше всего я подумал, что если я передам 0 в параметр хранимой процедуры, он игнорирует этот параметр, как это.

WHERE a.Country = (CASE WHEN @Country > 0 THEN @Country ELSE (something else) END)

так что (что-то еще) должно быть как никакое условие, оно может быть " > 0", поскольку идентификаторы страны из всех > 1, но я не знаю, как использовать > и = в том же CASE.

Любые предложения?

4b9b3361

Ответ 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)