在where子句中查询改进

时间:2014-04-29 14:36:33

标签: sql sql-server sql-server-2008-r2

我有以下查询:

DECLARE @MyTable TABLE
    (
      [ID] INT ,
      [Col1] INT ,
      [Col2] INT
    )



INSERT  INTO @MyTable
        SELECT  1 ,
                2 ,
                1
        UNION
        SELECT  1 ,
                2 ,
                3
        UNION
        SELECT  2 ,
                2 ,
                3
        UNION
        SELECT  2 ,
                2 ,
                3
        UNION
        SELECT  3 ,
                2 ,
                3
        UNION
        SELECT  3 ,
                2 ,
                1 



DECLARE @ID INT 

SET @ID = 1

SELECT  *
FROM    @MyTable
WHERE   ( Col1 = ( CASE WHEN [ID] = @ID THEN 2
                   END )
          OR [Col2] = ( CASE WHEN [ID] != @ID THEN 1
                        END )
        )

WHEN [ID] = @ID我想匹配Col1,常数值等于2,当[ID]!= @ID我希望匹配Col2时,常数值等于1.可以改进上面的查询,以便[ID]等式检查只能在上面的查询中完成一次,如下所示:

SELECT  *
FROM    @MyTable
WHERE  
if([ID] = @ID)
Col1=2
ELSE
[Col2]=1

2 个答案:

答案 0 :(得分:0)

这是你想要的逻辑吗?

where id = @id and col1 = 2 or
      id <> @id and col2 = 1

我不知道为什么你担心这样一个条款的表现。您可以使用case语句执行所需操作:

where 1 = (case when id = @id
                then (case when col1 = 2 then 1 end)
                else col2 = 1
           end)

但这是一个不必要的“优化”。甚至不清楚嵌套的case语句会比第一个版本更快。在现代计算机上,这种简单的操作确实非常快。而且,减慢数据库速度的因素是处理大量数据(一般而言),而不是简单的操作。

答案 1 :(得分:0)

也许只是:

Select  *
From    @MyTable
Where   ((id = @id and col1 = 2) or (id <> @id and col2 = 1))