SQL创建不同的逗号分隔列表

时间:2015-01-22 21:33:54

标签: sql sql-server csv pivot

我有一个接受逗号分隔列表的存储过程,然后使用带引号的字符串和括号创建该列表的副本,然后使用动态sql语句中的那些来构建具有灵活列数的数据透视表。

我的问题是,有时我的用户会提交包含重复项的列表,这会导致数据透视查询失败。所以我想以某种方式选择与逗号分隔的字符串不同。

这是我如何操纵初始字符串:

Declare @data varchar(max) = '150593, 150593, 150603, 150578, 150604'

Declare @bracketed varchar(max) = ''
Declare @quoted varchar(max) = ''

select @bracketed = @bracketed + quotename(rtrim(ltrim(Value))) + ', ',  
      @quoted = @quoted + quotename(rtrim(ltrim(Value)), '''') + ', '
from [dbo].[fnSplitStringAsTable](@data, ',')

Select @bracketed = LEFT(@bracketed, len(@bracketed) - 1), 
       @quoted = LEFT(@quoted, len(@quoted) - 1)

我认为我应该可以在此查询中的某处添加DISTINCT,
     但我不能让它发挥作用。如何选择与逗号分隔的列表不同?

3 个答案:

答案 0 :(得分:4)

作为替代解决方案,您可以在xml中重复数据删除并转换回varchar

Declare @data varchar(max) = '150593, 150593, 150603, 150578, 150604'
set @data= (select '''' + cast(cast('<d>'+replace(@data, ', ',',</d><d>')+'</d>'  as xml).query('distinct-values(/d)') as varchar) +'''')
select @data

答案 1 :(得分:0)

我想我们可以在制作表格之后添加不同的内容,如下所示:

select @bracketed = @bracketed + quotename(rtrim(ltrim(Value))) + ', ',  
      @quoted = @quoted + quotename(rtrim(ltrim(Value)), '''') + ', '
from (
  SELECT DISTINCT Value FROM [dbo].[fnSplitStringAsTable](@data, ',')
) T

如果失败,请尝试:

select @bracketed = @bracketed + quotename(Value) + ', ',  
      @quoted = @quoted + quotename(Value), '''') + ', '
from (
  SELECT DISTINCT RTRIM(LTRIM(Value)) AS Value FROM [dbo].[fnSplitStringAsTable](@data, ',')
) T

答案 2 :(得分:0)

使用一点动态sql,您可以从字符串变量中选择不同的值到表变量中,然后将这些值放回原始变量中:

declare @data varchar(max) = '150593, 150593, 150603, 150578, 150604'
declare @table table(data varchar(10))

set @data = 'select distinct value from (values (''' +
        replace(@data,', ','''),(''') + ''')) as v(value)'

insert into @table
    exec(@data)

set @data = ''
select @data = @data + data +
    case row_number() over(order by data desc)
        when 1 then ''
        else ','
    end
from @table
order by data asc

select @data