我有一个varchar输入变量,它包含逗号分隔的整数列表,这些整数列在select语句的其中一列中。我知道如何拆分列表并在where子句中使用它,例如:
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为null,则选择所有内容,如下所示:
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 :(得分:1)
WHERE子句中的函数调用会降低您的速度。这种方法并没有显着改善,但应该有所帮助......
WHERE (@ListOfAges is NULL OR
CHARINDEX(','+TRIM(STR(A.AGE))+',',','+@ListOfAges+',')) > 0)
同样,不是理想的方法,但应该比函数调用执行得更好。
我会尝试以下方法来优化性能..
WHERE CLAUSE应该是
WHERE @ListOfAges为null或NOT isNull(TT.Age)
答案 1 :(得分:0)
如果这是Sql 2005或更高版本,你可以在where子句中使用case语句......
答案 2 :(得分: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
答案 3 :(得分: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