Sql server 在Sql Server中添加Dyanmic In()条件
SQL Server查询生成面临的问题 在下面的查询中,添加了动态条件来检查值是否为nullSql server 在Sql Server中添加Dyanmic In()条件,sql-server,Sql Server,SQL Server查询生成面临的问题 在下面的查询中,添加了动态条件来检查值是否为null Select * From tblEmployees where EmployeeName = Case When @EmployeeName Is Not Null Then @EmployeeName
Select *
From tblEmployees
where EmployeeName = Case
When @EmployeeName Is Not Null
Then @EmployeeName
Else EmployeeName
End
但是我需要添加IN()条件,IN()中的参数with也可以为null或空,如果传递给IN条件的参数/字符串为空,那么我不想在查询中添加该条件
那么我怎样才能做到这一点呢?伸出援助之手对我来说是非常有用的
感谢和问候,
D.Mahesh根据参数的值(not为空),可以相应地创建SQL字符串
DECLARE @sqlCommand VARCHAR(1000)
IF(ISNULL(@YourParameter,'')='')
@sqlCommand = 'your query goes here'
ELSE
@sqlCommand = 'your query goes here'
然后,使用动态查询执行来运行它
EXEC (@sqlCommand)
如果不是动态查询,那么
SELECT ....
FROM ....
WHERE CASE WHEN ISNULL(@YourParameter,'')='' THEN '' ELSE EmployeeName END IN (ISNULL(@YourParameter,''))
看看这是否有效…我认为动态查询是最好的解决方案,但是您可以将“is NULL”和“is BLANK”条件放在或中的in子句中 诸如此类
Select *
From tblEmployees
where @EmployeeName is null or EmployeeName in (@EmployeeName)
当@EmployeeName为null时,您的IN子句将被忽略如果我做对了,您有
@EmployeeName='Name1,Name2,Name3'
,并且您希望获取名为Name1或Name2或Name3的员工,变量@EmployeeName
可以是null
或包含空字符串
您可以在上拆分字符串@EmployeeName
,
并将其存储在表变量或临时表中,而不必在中使用。然后,您可以在针对tblEmployees
的联接中使用该表来获取所需的行
在S.O.有很多关于如何分割字符串的帖子。这是一个最新的变体。
这适用于SQL Server 2005或更高版本
declare @EmployeeName varchar(100) = 'Name2,Name3,Name5'
-- Null or empty will have a comma
set @EmployeeName = coalesce(@EmployeeName, '') + ','
-- cteNames splits the string to rows
;with cteNames
as
(
select
left(@EmployeeName, charindex(',', @EmployeeName)-1) as Name,
right(@EmployeeName, len(@EmployeeName)-charindex(',', @EmployeeName)) as EmployeeName
union all
select
left(EmployeeName, charindex(',', EmployeeName)-1) as Name,
right(EmployeeName, len(EmployeeName)-charindex(',', EmployeeName)) as EmployeeName
from cteNames
where charindex(',', EmployeeName) > 1
)
select E.*
from tblEmployees as E
inner join cteNames as N
on E.Name = N.Name or
@EmployeeName = ','
-- @EmployeeName = ',' will give you all names when @EmployeeName is null of empty
你说的要求有点不清楚。请你再解释一下IN子句。嗨,Anil,谢谢你的回复,但是如果我不想在这种情况下创建动态查询,我该怎么做呢?i,谢谢你的回复,我尝试了你的方法,但是通过下面的示例,但仍然没有得到结果Declare@EmployeeName VARCHAR(500)--set@EmployeeName='''test1'',''test2''set@EmployeeName='''nishap'--set@EmployeeName=null--set@EmployeeName=''从STBStg.StgUserFilter中选择*,当CASE为null(@EmployeeName,'')=''时,其他用户名以(@EmployeeName)@Mahesh结尾:尝试从@EmployeeName中删除引号。它应该是“test1,test2”,我已经设置了像这样的值Declare@EmployeeName VARCHAR(500)set@EmployeeName=“test1,test2”,并运行上面的查询,它给了我错误-无效的列名“test1,test2”。否则,只需输入IF条件并编写两个单独的查询-一个IF为空,另一个在else部分使用in子句hi,我尝试了您的方法,但它没有给我适当的结果下面是我尝试声明@EmployeeName VARCHAR(500)--设置@EmployeeName=''test1'',''test2''作为通讯值的代码,如果它不是工作集@EmployeeName=''nishap'--set@EmployeeName=null--set@EmployeeName=''exece('Select*From STBStg.StgUserFilter,其中(+@EmployeeName+')为空或('+@EmployeeName+')中的用户名)@Mahesh:看起来你在这里使用的是动态查询。如果是这样,为什么要在WHERE
子句中添加空条件呢?如果@EmployeeName
为空,只需不添加WHERE子句,如果不为空,只需将其添加为“…WHERE EmployeeName in(+@EmployeeName+”)“
@Mahesh:另一方面,如果你想避免动态查询,正如你在别处评论的那样,那么你不能使用@EmployeeName
作为中中的项目列表,在那里只能将@EmployeeName
视为单个字符串值。我同意Andriy M。但是如果你需要在IN claus中使用一个参数e您必须创建一个过程来将其拆分为一个列表,因为TSQL不支持数组类型变量(据我所知).嗨,安德烈,谢谢你的回复,因为如果我避免动态查询,我就不可能在中发送项目列表。我同意你的观点,所以我会继续动态查询,但仍然不会在动态查询中获取项目列表。这里是场景Declare@EmployeeName VARCHAR(500)设置@EmployeeName=''nishap'',''mihir''EXEC('从STBStg.StgUserFilter中选择*,其中filtertype=''AccountFilter''和(+@EmployeeName+')为null或('+@EmployeeName+')中的用户名),如果传递了单个值,则它可以工作,但不能用于多个值(项目列表)您好,Mikael,谢谢您的工作非常好,但是如果我需要在条件中添加这样的4-5,这意味着我需要创建4-5个内部联接,这不会使我的查询变慢。我无法对您的系统中的性能发表任何意见。这取决于您的表中有多少数据以及其中有哪些索引等。