CASERE在WHERE,SQL Server中

el *_*nho 19 sql sql-server case where

我正在做一些搜索,用户在下拉菜单中选择一些条款.当他们将一些框留空时,我想查询忽略子句.我知道CASE,我最好的想法是,如果我将0传递给存储过程中的参数,它会忽略该参数,就像这样.

WHERE a.Country = (CASE WHEN @Country > 0 THEN @Country ELSE (something else) END)
Run Code Online (Sandbox Code Playgroud)

所以,(别的东西)应该没有条件,它可以是'> 0',因为国家ID来自所有> 1,但我不知道如何在同一个CASE中使用>和=.

有什么建议?

Ada*_*Dev 29

几种方式:

-- 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
Run Code Online (Sandbox Code Playgroud)

或者,使用动态生成的语句,并仅在适当时添加Country条件.这应该是最有效的,因为您只执行具有实际需要应用的条件的查询,并且如果支持索引到位,则可以产生更好的执行计划.您需要使用参数化SQL来防止SQL注入.


Aar*_*and 5

您可以简化为:

WHERE a.Country = COALESCE(NULLIF(@Country,0), a.Country);
Run Code Online (Sandbox Code Playgroud)