SQL用于在输入变量中包含基于列的行,如果变量为null,则包括所有行

时间:2014-01-10 16:25:49

标签: sql sql-server

我有一个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子句?我不确定是否可以在连接中包含它,或者是否建议采用完全不同的方法(例如不使用逗号分隔的输入变量)。

谢谢!

4 个答案:

答案 0 :(得分:1)

WHERE子句中的函数调用会降低您的速度。这种方法并没有显着改善,但应该有所帮助......

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

同样,不是理想的方法,但应该比函数调用执行得更好。

我会尝试以下方法来优化性能..

  • 创建一个包含年龄列表的临时表。
  • 使用别名TT
  • 将此表与A.Age上的年龄联系起来
  • WHERE CLAUSE应该是

    WHERE @ListOfAges为null或NOT isNull(TT.Age)

答案 1 :(得分:0)

如果这是Sql 2005或更高版本,你可以在where子句中使用case语句......

http://msdn.microsoft.com/en-us/library/ms181765.aspx

答案 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