2014-04-29 203 views
1

我有以下查询:查询改善where子句

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 

回答

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语句会比第一个版本更快。现代计算机上这种简单的操作确实很快。而且,减慢数据库速度的是处理大量数据(一般情况下),而不是简单的操作。

0

也许只是:

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