如何在T-SQL中使用逗号分隔的值列表作为过滤器?

9 浏览
0 Comments

如何在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

0
0 Comments

问题的原因是用户想要在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中使用逗号分隔的值作为过滤器,并且可以去除额外的空格。

0
0 Comments

在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语句中使用多个值的形式。

0
0 Comments

问题出现的原因:

用户在使用T-SQL中的逗号分隔值作为过滤器时遇到困难,希望获得解决方法。

解决方法:

尝试使用Case语句作为IIF或三元运算符的替代方案。可以参考这个链接:http://msdn.microsoft.com/en-us/library/ms181765.aspx

示例代码:

CASE WHEN MyNum < 10 THEN 'Small' ELSE 'Big' END

希望以上信息对您有所帮助。

0