如何在T-SQL中使用逗号分隔的值列表作为过滤器?
如何在T-SQL中使用逗号分隔的值列表作为过滤器?
我有一个基本的SQL查询,从以下代码开始:
SELECT top 20 application_id, [name], location_id FROM apps
现在,我想完成它,使其实现以下功能(以伪代码形式写出):
if @lid > 0 then WHERE location_id IN (@lid) else WHERE location_id是location_id列中的所有值
根据要求,这里有一个示例:
application_id name location_id ---------------------------------------------------------- 1 Joe Blogs 33 2 Sam Smith 234 3 Jeremy Carr 33
@lid是用户给出的结果,例如'33, 234'
如果@lid为空,则我希望它输出location_id列中的所有行,并包含name和application_id。否则,我希望它输出与@lid中提供的数字相关的所有行(代表location_id)。
所以,如果@lid为0:
application_id name location_id ---------------------------------------------------------- 1 Joe Blogs 33 2 Sam Smith 234 3 Jeremy Carr 33
否则,如果@lid包含'33':
application_id name location_id ---------------------------------------------------------- 1 Joe Blogs 33 3 Jeremy Carr 33
问题的原因是用户想要在T-SQL中使用逗号分隔的值作为过滤器,但是不清楚如何实现。下面是解决方法:
用户可以使用CHARINDEX函数来实现这一目的。首先,他们需要将逗号分隔的值转换为逗号包围的字符串,并将其与数据库中的值进行比较。在这个例子中,用户想要过滤location_id等于0或包含在逗号分隔的值中的行。
为了实现这一点,用户可以使用以下代码:
SELECT application_id, [name], location_id FROM apps WHERE ( location_id = 0 OR CHARINDEX ( ',' + CAST(location_id AS VARCHAR(50)) + ',' , ',' + @filter + ',' , 0 ) > 0 )
在这个例子中,@filter是用户传入的逗号分隔的值。代码首先将location_id转换为字符串,并将其用逗号包围,然后将其与@filter进行比较。如果@filter中包含了location_id的值,则CHARINDEX函数将返回大于0的值,满足过滤条件。
此外,用户还提到了如何去除CSV中额外的空格。为了解决这个问题,他们可以使用LTRIM和RTRIM函数来去除字符串的前导和尾随空格,例如:
DECLARE @filter VARCHAR(100) = ' 1, 2, 3, 4 ' SELECT application_id, [name], location_id FROM apps WHERE ( location_id = 0 OR CHARINDEX ( ',' + CAST(location_id AS VARCHAR(50)) + ',' , ',' + LTRIM(RTRIM(@filter)) + ',' , 0 ) > 0 )
在这个例子中,LTRIM(RTRIM(@filter))将去除@filter中的前导和尾随空格。
通过使用CHARINDEX函数和LTRIM/RTRIM函数,用户可以在T-SQL中使用逗号分隔的值作为过滤器,并且可以去除额外的空格。
在T-SQL中如何使用逗号分隔的值列表作为过滤条件?
问题的出现原因是用户提供了一个逗号分隔的值列表,例如'33, 234',无法直接将变量扩展为location_in IN (33, 234)
。实际上,你要求的是location_id = '33, 234'
,这将由于数据类型优先级导致CAST转换失败。
解决方法是首先将列表解析成表格形式,以便在JOIN/EXISTS结构中使用。这里有几种选择,Erland在这里都进行了介绍:Arrays and Lists in SQL Server 2005。
你是正确的,我已经解析了这个varchar "list",以便在一个select语句中检查每个值,实现了在一个select语句中使用多个值的形式。
问题出现的原因:
用户在使用T-SQL中的逗号分隔值作为过滤器时遇到困难,希望获得解决方法。
解决方法:
尝试使用Case语句作为IIF或三元运算符的替代方案。可以参考这个链接:http://msdn.microsoft.com/en-us/library/ms181765.aspx。
示例代码:
CASE WHEN MyNum < 10 THEN 'Small' ELSE 'Big' END
希望以上信息对您有所帮助。