2012-02-21 77 views
0

當嘗試根據是否傳遞某個值返回適當的結果時,我遇到了使用CASE時遇到的問題。在SQL Server 2008中使用CASE

例如我想運行一個查詢,如果郊區傳遞

WHEN @suburb <> '' THEN 
@suburb 
END 
= [Suburb] 
AND 
[City] = @city 

但是怎麼辦,這樣,當沒有郊區傳遞它僅使用這個城市我只運行查詢?

我應該寫下如下的查詢嗎?

WHERE 
(
    [Suburb] = @suburb 
    AND 
    [City] = @city 
) 
OR 
(
    [City] = @city 
) 
+0

我絕對不會寫在第二種形式。 – 2012-02-21 21:42:55

+0

@Aaron Bertrand - 爲什麼不推薦在第二個寫? – PeanutsMonkey 2012-02-21 22:26:26

+0

因爲爲什麼重複兩次「城市= @城市」條款? – 2012-02-21 22:35:35

回答

1

你並不真的需要CASE

WHERE (suburb = @suburb OR @suburb = '' OR @suburb IS NULL) AND city = @city 
+0

這就像一個魅力。一個問題,雖然我是一個SQL新手。我猜測OR語句只有在第一個條件失敗的情況下才能滿足,例如如果'suburb = @ suburb'沒有值,那麼它會繼續處理'@suburb ='''。泰勒是對的嗎? – PeanutsMonkey 2012-02-21 21:32:52

+1

不,SQL不會短路。所有表達式都被評估。 – 2012-02-21 21:36:26

+0

http://weblogs.sqlteam.com/jeffs/archive/2003/11/14/513.aspx上的文章似乎暗示了它的作用,除非我誤解了。如果評估所有條件,是否可以滿足所有這些條件? – PeanutsMonkey 2012-02-21 21:48:07

1

由於您使用SQL Server 2008中,你要在這裏使用的OPTION (RECOMPILE)提示,以避免緩存不適當的計劃。有關更多詳細信息,請參閱Catch-all queries

... 
WHERE ((@suburb = '') OR (@suburb <> '' AND [Suburb] = @suburb)) 
    AND [City] = @city 
OPTION (RECOMPILE) 
+0

+1用於處理參數嗅探的風險 – 2012-02-21 21:23:34

1

有幾種可供選擇的方式來實現,你可以嘗試其中之一..

WHERE [City] = @city 
AND ([Suburb] = @suburb OR '' = '') 
0
SELECT FirstName, LastName, TelephoneNumber, "When to Contact" = 
CASE 
     WHEN TelephoneSpecialInstructions IS NULL THEN 'Any time' 
     ELSE TelephoneSpecialInstructions 
END 

FROM Person.vAdditionalContactInfo;