2014-01-10 44 views
1

我有一個包含一個逗號分隔的是,在我的SELECT語句中的一列整數列表中的VARCHAR輸入變量。我知道如何分割的列表,並使用在where子句中,例如:SQL爲包括基於列表中輸入變量或行中的所有行,如果變量是空

DECLARE @ListOfAges Varchar 
SET @ListOfAges = '15,20,25' 

select p.Name, a.Age 
from People p 
left join Ages a on p.AgeKey = a.AgeKey 
Where a.Age in (dbo.Split(@ListOfAges)) 

我想要做的是,如果@ListOfAges var爲空,選擇一切,所以是這樣的:

select p.Name, a.Age 
from People p 
left join Ages a on p.AgeKey = a.AgeKey 
Where (@ListOfAges = null OR a.Age in (dbo.Split(@ListOfAges))) 

這是有辦法做到這一點,執行得更好?可能沒有在WHERE子句中使用IN子句?我不確定是否可以在連接中包括這個,或者建議採用完全不同的方法(例如不使用逗號分隔的輸入變量)。

謝謝!

+0

當用(in in(15,20,25)''替換in(dbo.Split(@ListOfAges))'時,性能如何?它實質上更好嗎?這是您可以通過消除分割而無需其他操作來實現的性能上限。如果這種表現不可接受,那麼您可能需要查看是否還有其他需要優化的內容。 – dasblinkenlight

回答

1

函數調用中的WHERE子句放慢你失望。這種做法是不顯着提高,但應該有點幫助..

WHERE (@ListOfAges is NULL OR 
     CHARINDEX(','+TRIM(STR(A.AGE))+',',','[email protected]+',')) > 0) 

同樣,並不是一個理想的方法,但應該執行比函數調用更好。

我會嘗試以下方法來優化性能..

  • 隨着年齡的列表中創建一個臨時表。
  • LEFT JOIN此表與中世紀的a.Age使用別名TT
  • WHERE子句應

    WHERE @ListOfAges爲空或不是ISNULL(TT.Age)

0
select p.Name, a.Age 
from People p 
left join Ages a on p.AgeKey = a.AgeKey 
inner join dbo.Split(@ListOfAges) s on a.Age = s.Age 
UNION ALL 
select p.Name, a.Age 
from People p 
left join Ages a on p.AgeKey = a.AgeKey 
WHERE @ListOfAges IS NULL 
0
DECLARE @ListOfAges Varchar 
SET @ListOfAges = '15,20,25' 


if @ListOfAges in ('15,20,25') 



select p.Name, a.Age 
from People p 
left join Ages a on p.AgeKey = a.AgeKey 
Where a.Age in (dbo.Split(@ListOfAges)) 


else 

select p.Name, a.Age 
from People p 
left join Ages a on p.AgeKey = a.AgeKey