我试图根据传入的参数选择表的不同值。
我有正确运行的代码,如下所示。
declare @type as int
set @type = 3
if @type = 1
select * from t
else if @type = 2
select * from t WHERE theType = 2 or theType = 3
else if @type = 3
select * from t where theType = 3
这很好,但是我想尽可能地摆脱if语句。
有什么办法可以使这段代码具有相同的结果,但是运行得更好?
谢谢!
答案 0 :(得分:2)
您可以尝试将其重写为单个查询:
select *
from t
where
@type = 1 or
(@type = 2 and theType in (2, 3)) or
(@type = 3 and theType = 3);
我不知道它的实际运行速度是否会比您目前的运行速度快,但是它确实摆脱了if语句。
答案 1 :(得分:0)
另一种方法可能是动态SQL。如果我们提供的示例过于简化,则使用OR
逻辑(如Tim的答案)可能最终会导致缓存的查询计划不利于正在运行的查询。这确实是正确的,因为@type = 1
返回所有行,并且当它的值为3
时将其过滤为单个值。这意味着1
和3
的估算值将非常不同。
这给你这样的东西:
DECLARE @type int;
SET @type = 3;
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT * FROM t' +
CASE @type WHEN 1 THEN N';'
WHEN 2 THEN N' WHERE theType = 2 or theType = 3;'
WHEN 3 THEN N' WHERE theType = 3'
END;
EXEC sp_executesql @SQL;
这并不是说Tim的答案是错误的,但是对于某些值,您最终可能会获得较差的性能。`