2010-11-11 115 views
1

嘗試設置一個SQL存儲過程,如果傳遞給它的變量等於關鍵字'All'它將取消WHERE子句中的'PlatformName'列並返回PlatformName中的所有內容以及@Title中的變量。SQL WHERE子句與案例

我的SQL代碼如下。

WHERE PlatformName = CASE @Platform 
         WHEN 'All' THEN '' 
         ELSE @Platform 
        END 
AND Title LIKE '%' + @Title + '%' 

的'不返回任何東西。

 
Table 
PlatformName Title 
XBox 360  Foobar 
PS3   Foobar 
+0

這是不是一個完整的問題。平臺是'全部'還是我假設'XBOX','Playstation'等?做一個簡單的選擇來確定當PlatformName =''和Title LIKE'%'+ @Title +'%'時返回的內容。告訴我你得到了什麼。 – 2010-11-11 10:47:29

+0

再次查看問題。對困惑感到抱歉。它已被編輯。 – KennyH 2010-11-11 10:49:43

回答

4

一種方法做的正是你正在嘗試做的是:

WHERE PlatformName = CASE @Platform 
         WHEN 'All' THEN PlatformName 
         ELSE @Platform 
        END 
AND Title LIKE '%' + @Title + '%' 

你會看到使用的另一種常用方法是:

WHERE (PlatformName = @Platform OR @Platform = 'All') 
    AND ... 

我建議那些測試表現。

+0

工程很棒。謝謝! – KennyH 2010-11-11 13:53:15

0

就做這樣的事情:

WHERE ((PlatformName = @Platform) OR (@Platform = 'All')) 

注意:如果你正在做在你的查詢中使用聯接您可能會看到一個性能增益,如果您添加到了一起。例如,

SELECT * 
FROM Games G 
JOIN Platform P ON G.pID = P.pID AND ((PlatformName = @Platform) OR (@Platform = 'All')) 

這樣,平臺表的掃描就會減少,查詢速度會更快。

+0

奇怪的是得到這個正確答案的投票,評論會很好。 – Hogan 2010-11-11 12:39:59

+0

我沒有投票自己,但我懷疑你「你可以看到一個很大的表現」的說法。 – onedaywhen 2010-11-11 13:09:09

+0

@onedaywhen:公平點 - 在這種情況下,它依賴於目標表(例如平臺)的表大小。我已經看到這種改變將查詢從幾秒鐘減少到幾毫秒,但它依賴於涉及的表格。我確實刪除了「大」作爲點頭,並不總是如此。 – Hogan 2010-11-11 16:47:56

-1

的語法是正確的,我想在我的SQL Server數據庫,並將它與下面的查詢工作:

SELECT * FROM CNT 
WHERE CP_NOM = CASE CP_COD WHEN 2824 THEN 'NOMBRE' END AND CP_COD > 10 

也許錯誤帶有您的變量的值@Platform OR @Title

在任何情況下,你不能與所有「替換您的空平臺領域(PlatformName =')」的值,你可以讓一個更簡單的查詢

WHERE PlatformName = @Platform AND Title LIKE '%' + @Title + '%' 
+0

這是錯誤的。他不希望All匹配他希望它匹配每條記錄的空白字段。 – Hogan 2010-11-11 11:29:45

+0

這就是他的查詢正在做的事情。現在編輯的問題,我明白他想要什麼。但是,我解釋瞭如何在WHERE內使用CASE,這是任務的標題。 – greuze 2010-11-12 09:35:58