情况何时在WHERE中使用LIKE条件而不是1

时间:2014-10-22 01:45:50

标签: sql sql-server performance tsql stored-procedures

我在where子句中的AND内有一堆OR的查询,我试图用CASE WHEN替换它们以查看它是否提高了性能。

存储过程中的选择查询类似于:

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),额外()等,但没有成功。

有没有办法在LIKE CASE WHEN WHERE中添加CASE WHEN,或者如果使用{{1}}而不是原始的IF,则我不会打扰任何表现差?

更新

这实际上并没有表现出任何明显的差异。

3 个答案:

答案 0 :(得分:2)

网上有很多关于这些“可选”类型存储过程的信息,以及如何避免参数嗅探性能问题。

这种语法可以让你更接近:

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

只需确保col1和col2数据类型相似(不要混用INTVARCHAR

您应该比较两种语法之间的查询计划,以确定它是否有所作为。您的性能问题可能更多地归因于参数嗅探。

答案 1 :(得分:1)

您还可以尝试嵌套的case语句。例如根据您的最新帖子,例如:

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

答案 2 :(得分:0)

以下是我如何使用它,现在只需要测试它是否对性能产生任何影响。 @ Nick.McDermaid的参数嗅探值得一看。

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