2014-10-22 44 views
1

我有一個或多個OR內部的一個AND在Where子句中的查詢,我試圖用CASE WHEN來替換它們以查看它是否改進了性能。CASE當在與LIKE條件而不是1的情況下

的存儲過程中的SELECT查詢語句是這樣的:

DECLARE @word = '%word%' --These are inputs 
DECLARE @type = 'type' 

SELECT * FROM table1 
WHERE SomeCondition1 
AND ((@type = 'CS' AND col1 like @word) 
     OR 
     (@type = 'ED' AND col2 like @word) 
     .... 
) 

我想寫這個查詢爲:

SELECT * FROM table1 
WHERE SomeCondition1 
AND (1= CASE WHEN @type = 'CS' 
       THEN col1 like @word 
       WHEN @type = 'ED' 
       THEN col2 like @word 
      END) 

但SQL 2012提供了錯誤「附近有語法錯誤一樣'爲THEN col1 like @word。如果我將THEN col1 like @word替換爲1,那麼沒有任何抱怨,但LIKE應該返回0或1。

我試過SELECT (col1 like @word),額外()等沒有成功。

有沒有一種辦法,包括在CASE WHENLIKEWHERE或者我應該只是如果使用CASE WHEN代替了原來的IF的不會讓任何性能上的差異不煩?

UPDATE:

這其實並沒有什麼區別表現明智的。

回答

2

關於這些'可選'類型的存儲過程以及如何避免參數嗅探性能問題,網上有很多信息。

這句法應該讓你更接近,但:

AND CASE 
    WHEN @type = 'CS' THEN col1 
    WHEN @type = 'ED' THEN col2 
    END LIKE @word 

只需確保col1和col2上的數據類型是相似的(不要混合INTVARCHAR

你應該比較兩者之間的查詢計劃語法來確定它是否有所作爲。您的性能問題可能更多地是由於參數嗅探。

+0

謝謝,我會看看你給的信息,但因爲我需要做的'COL1 LIKE @ word'而不是你的樣品不會爲我工作'@ LIKE col1'。但我找到了一種方法來讓它工作,我現在要發佈。 – artm 2014-10-22 02:12:07

+0

我的錯誤...我會扭轉它。 – 2014-10-22 02:16:07

0

下面是我如何運作,現在只需要測試它是否會對性能產生影響。 @ Nick.McDermaid的參數嗅探值得關注。

1 = CASE WHEN @type = 'CandidateStatus' 
     THEN (SELECT 1 WHERE co.[Description] LIKE @text) 
1

您也可以嘗試嵌套的case語句。例如根據您的最新帖子,是這樣的:

1 = CASE WHEN @type = 'CandidateStatus' 
     THEN (CASE WHEN co.[Description] LIKE @text THEN 1 END) 
    ... 
    END 
相關問題