2014-10-22 47 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 
相关问题