使用多个if语句优化SQL查询

时间:2019-06-06 11:05:55

标签: sql-server tsql

我试图根据传入的参数选择表的不同值。

我有正确运行的代码,如下所示。

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语句。

有什么办法可以使这段代码具有相同的结果,但是运行得更好?

谢谢!

2 个答案:

答案 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时将其过滤为单个值。这意味着13的估算值将非常不同。

这给你这样的东西:

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的答案是错误的,但是对于某些值,您最终可能会获得较差的性能。`