SQL Server - 针对所有可能的值搜索逗号分隔列表

时间:2013-10-31 01:05:59

标签: sql-server reporting-services

场景:我有一个SSRS报告,其中包含一堆过滤器。其中一个过滤器是“区域”,我得到的区域是这样的:

SELECT DISTINCT Area FROM tblArea ORDER BY Area

对于从中获取其可用值的参数,我有一个默认值“All”,因此输出将如下:

所有 区域1 区域2 中国 我们 等

在报告中,他们可以选择“全部”,当传递给主存储过程时,参数将如下所示:

全部,区域1,区域2,中国,美国等

现在出现问题:在我查询Area列的表中可能包含如下数据:

Area
--------
Area2,US

查询是

SELECT * FROM tbl WHERE TPC IN (@Area) -- All,Area1,Area2,China,US,etc

这不会找到我要找的记录。

简而言之,如何将逗号分隔列中的每个值与逗号分隔的参数进行比较?

提前致谢,

3 个答案:

答案 0 :(得分:0)

您的查询正在查找单个值,其中包含逗号。 in不解析字符串。

您可以使用like

执行您想要的操作
where @Area = 'All' or
      ','+TPC+',' like '%,'+@Area+',%';

当一个区域包含在另一个区域(例如“US”和“USSR”)时,逗号的使用是为了防止碰撞。

答案 1 :(得分:0)

我认为以下示例将解决您的目的

CREATE TABLE #TBL
    ([Id] int, [Areas] varchar(11))
;

INSERT INTO #TBL 
    ([Id], [Areas])
VALUES
    (1, 'abc,def,ghi'),
    (2, 'abc,def'),
    (3, 'abc')
;


DECLARE @Area VARCHAR(100)  -- parameter
SET @Area = 'All,abc,def,ghi'

;with cte
as
(
    select Areaxml.s.value('.','varchar(100)') as Area
    from
    (
    select convert(xml,'<m>'+replace(@Area,',','</m><m>')+'</m>') as CArea 
    )t
    cross apply
    CArea.nodes('/m') as Areaxml(s)
)


select * FROM #TBL
where exists (select Area from cte where [Areas] LIKE '%'+ Area +'%')

DROP TABLe #TBL

答案 2 :(得分:0)

在SQL中,您必须创建一个表值函数,它将逗号分隔的字符串@Area转换为Table。然后,您可以使用此表进行查询。

ALTER FUNCTION [dbo].[List_to_tbl] (@list nvarchar(MAX))
    RETURNS @tbl TABLE (stringsTable nvarchar(10) NOT NULL) AS
BEGIN
   DECLARE @pos        int,
       @nextpos    int,
       @valuelen   int

 SELECT @pos = 0, @nextpos = 1

  WHILE @nextpos > 0
       BEGIN
          SELECT @nextpos = charindex(',', @list, @pos + 1)
          SELECT @valuelen = CASE WHEN @nextpos > 0
                          THEN @nextpos
                          ELSE len(@list) + 1
                     END - @pos - 1
          INSERT @tbl (stringsTable)
              VALUES (substring(@list, @pos + 1, @valuelen))
          SELECT @pos = @nextpos
     END
 RETURN

 END

现在您可以从您的存储过程中调用此

Select * from TBL where TPC in (Select stringTable from List_to_tbl(@Area))