Вопрос по case, sql, sql-server – ДЕЛО в ГДЕ, SQL Server

17

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

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

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

Какие-либо предложения?

Ваш Ответ

5   ответов
1

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

-- 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.

5

WHERE a.Country = COALESCE(NULLIF(@Country,0), a.Country);
3

(something else) должно бытьa.Country

еслиCountry обнуляется, то сделать(something else) бытьa.Country OR a.Country is NULL

@MartinSmith Хороший улов!
ПредполагаетCountry не обнуляется.
1

.. ELSE a.Country ...

Похожие вопросы