2016-02-29 38 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