我在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,则我不会打扰任何表现差?
更新
这实际上并没有表现出任何明显的差异。
答案 0 :(得分:2)
网上有很多关于这些“可选”类型存储过程的信息,以及如何避免参数嗅探性能问题。
这种语法可以让你更接近:
AND CASE
WHEN @type = 'CS' THEN col1
WHEN @type = 'ED' THEN col2
END LIKE @word
只需确保col1和col2数据类型相似(不要混用INT
和VARCHAR
)
您应该比较两种语法之间的查询计划,以确定它是否有所作为。您的性能问题可能更多地归因于参数嗅探。
答案 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)