2016-02-29 68 views
0

我有两列的情况条件的别名列,我需要应用与多个范围之间,我试过Alias between 10 and 1000 OR Alias between 2000 and 4000它需要太多的时间来执行。请建议正确的方式或替代方式。SQL查询与“之间”的别名列与多个范围

我的查询:

select X.Id, X.Name 
from TableX X 
where ((CASE WHEN X.a ='True' THEN X.Id ELSE X.PId END) between 0 and 1000 
    OR (CASE WHEN X.a ='True' THEN X.Id ELSE X.PId END) between 2000 and 4000) 
+0

saaduu你看我的回答吗? – Yossi

回答

0

你能避免使用OR这样的:

select X.Id, X.Name 
from TableX X 
where (CASE WHEN X.a ='True' THEN X.Id ELSE X.PId END) between 0 and 4000 
    and not (CASE WHEN X.a ='True' THEN X.Id ELSE X.PId END) between 1001 and 1999 
2

重新写而不WHERE子句中CASE表达式:

select X.Id, X.Name 
from TableX X 
where (X.a = 'True' 
     AND (X.Id between 0 and 1000 OR X.Id between 2000 and 4000)) 
    OR (X.a <> 'True' 
     AND (X.PId between 0 and 1000 OR X.PId between 2000 and 4000)) 

是TableX的。 Id和TableX.PId编入索引?

+0

没有那两列没有索引 – Ray

+1

@saaduu,今天提示:创建索引! – jarlh

+0

这种方式只适用于索引列或什么? – Ray

0
;WITH cteTab as 
(
    select X.Id, X.Name, CASE WHEN X.a ='True' THEN X.Id ELSE X.PId END as InRange 
    from TableX X 
) 
select X.Id, X.Name 
from cteTab X 
where x.InRange between 0 and 1000 
    OR x.InRange between 2000 and 4000 
+1

请提供一个简短的解释。 – Alexei