【问题标题】:CASE WHEN in WHERE with LIKE condition instead of 1CASE WHEN in WHERE 使用 LIKE 条件而不是 1
【发布时间】:2014-12-17 09:53:16
【问题描述】:

我在 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 提供了错误“Incorrect Syntax Near Like”。如果我将THEN col1 like @word 替换为1,则不会有任何抱怨,但 LIKE 无论如何都应该返回 0 或 1。

我尝试了SELECT (col1 like @word)、额外的()等,但没有成功。

有没有办法将LIKE 包含在CASE WHENWHERE 中,或者如果使用CASE WHEN 而不是原来的IF 不会产生任何性能差异,我应该不打扰?

更新:

这实际上对性能没有任何影响。

【问题讨论】:

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


    【解决方案1】:

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

    这个语法应该让你更接近:

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

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

    您应该比较两种语法之间的查询计划,以确定它是否会产生影响。您的性能问题可能更多是由于参数嗅探造成的。

    【讨论】:

    • 谢谢,我会查看您提供的信息,但您的示例对我不起作用,因为我需要使用 col1 LIKE @word 而不是 '@word LIKE col1'。但我找到了一种让它工作的方法,我现在将其发布。
    • 我的错...我会改过来的。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这是我如何让它工作的,现在只需要测试它是否对性能有任何影响。 @Nick.McDermaid 的参数嗅探值得一看。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-01
        • 1970-01-01
        • 2019-05-12
        • 2023-03-20
        • 1970-01-01
        相关资源
        最近更新 更多