2012-04-17 102 views
13

我正在做一些搜索,用戶在下拉列表中選擇一些子句。當他們留下一些空的框時,我想查詢忽略子句。我知道CASE,最好的我想到的是,如果我將0傳遞給存儲過程中的參數,它會忽略該參數,就像這樣。CASE在哪裏,SQL Server

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

所以,(別的)應該是這樣沒有條件,也可以是「> 0」作爲國家的IDS都是來自> 1,但我不知道如何使用>和=在同一案件。

有什麼建議嗎?

回答

24

幾個方法:

-- 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注入。

3

(something else)應該a.Country

如果Country爲空則使(something else)a.Country OR a.Country is NULL

+0

假定「國家」不可空。 – 2012-04-17 12:43:47

+0

@MartinSmith很好! – SliverNinja 2012-04-17 12:47:46

1

試試這個:

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

你可以簡化爲:

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