使用ISNULL时如何在中使用SQL
下面的参数看起来类似于(2,3,4,5)或(2),甚至为NULL。列ServiceEntryPart在代码部分中可能包含如下数据。我的问题是正确的语法是什么,这样我就可以使用过滤器了。如果过滤器为空,我将完全忽略它。到目前为止,如果它是NULL(不包括过滤器),那么我所拥有的一切都可以正常工作,但是当我拥有参数(例如(1,2))时,它就不工作了。。谢谢使用ISNULL时如何在中使用SQL,sql,sql-server,Sql,Sql Server,下面的参数看起来类似于(2,3,4,5)或(2),甚至为NULL。列ServiceEntryPart在代码部分中可能包含如下数据。我的问题是正确的语法是什么,这样我就可以使用过滤器了。如果过滤器为空,我将完全忽略它。到目前为止,如果它是NULL(不包括过滤器),那么我所拥有的一切都可以正常工作,但是当我拥有参数(例如(1,2))时,它就不工作了。。谢谢 ServiceEntryPart.ServiceTypeIDs 4,3 3 NULL 1 8 2,5 --Filter: @
ServiceEntryPart.ServiceTypeIDs
4,3
3
NULL
1
8
2,5
--Filter:
@ServiceTypes nvarchar(100) = NULL
--Filter with values SET @ServiceTypes = (1,2,4,5)
--Where Clause
WHERE (ServiceEntryPart.ServiceTypeIDs = ISNULL(@ServiceTypes,ServiceEntryPart.ServiceTypeIDs)
看起来您想为in子句传入一个变量列表。一种方法是使用动态SQL,但我认为这太过分了 您可以尝试以下方法:
where @ServiceTypes is null or
charindex(','+cast(ServiceEntryPart.ServiceTypeIDs as varchar(255)+',',
','+@ServiceTypes+',') > 0
这是使用字符串搜索来执行中的等效操作。它假定@ServiceTypes是一个逗号分隔的列表,没有空格。它在逗号前加和后加。当您查找类似于5的内容时,它实际上查找的是“5”,因此它与列表中的25或55不匹配。您不能将列表中的整个
作为单个命名参数传递给查询,无论是否使用ISNULL
。那么您要说的解决方案是什么?您需要定义所需的行为。如果参数为@ServiceTypes is null,您希望a)忽略该参数还是b)仅拾取null值?另外,破坏1NF也是个坏主意。@Conrad我想使用这个过滤器,如果它包含一个值,如果它为空,那么我将完全忽略它。如果一个问题的结果是否定的,则暗示您的问题需要解决。最后的投票表明你的问题太神秘了,无法修正。我明白了,这太棒了!感谢你的回答!!:)