用于在输入变量中包含基于列表的行或在变量为null时包含所有行的SQL

用于在输入变量中包含基于列表的行或在变量为null时包含所有行的SQL,sql,sql-server,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))

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


谢谢

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


WHERE子句中的函数调用正在减慢速度。这种方法并没有明显的改善,但应该会有所帮助

WHERE (@ListOfAges is NULL OR
       CHARINDEX(','+TRIM(STR(A.AGE))+',',','+@ListOfAges+',')) > 0)
同样,这不是一种理想的方法,但应该比函数调用执行得更好

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

  • 创建包含年龄列表的临时表
  • 使用别名TT将此表与a.Age上的Age左键联接
  • WHERE子句应该是

    其中@ListOfAges为空或不为空(TT.Age)


将(dbo.Split(@ListOfAges))中的
替换为(15,20,25)中的
时性能如何
?它实质上更好吗?这是通过消除拆分而不做其他操作可以实现的性能上限。如果这个性能不可接受,您可能想看看是否还有其他东西需要优化。
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
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