23

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

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

所以,(其他东西)应该像没有条件一样,它可以是“> 0”,因为国家/地区 ID 都来自 > 1,但我不知道如何在相同的情况下使用 > 和 =。

有什么建议么?

4

5 回答 5

36

几种方法:

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

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

于 2012-04-17T12:44:17.240 回答
5

您可以简化为:

WHERE a.Country = COALESCE(NULLIF(@Country,0), a.Country);
于 2012-04-17T12:44:10.823 回答
3

(something else)应该a.Country

如果可以Country为空,则为(something else)a.Country OR a.Country is NULL

于 2012-04-17T12:41:56.330 回答
1
.. ELSE a.Country ...

我想

于 2012-04-17T12:42:06.023 回答
1

尝试这个:

WHERE a.Country = (CASE WHEN @Country > 0 THEN @Country ELSE a.Country END)
于 2012-04-17T12:42:38.140 回答