将列中的CSV记录转换为多行

时间:2010-08-31 15:50:59

标签: sql mysql

select * from responses带来:

2 | user_name | green,red

我是否可以更改查询以使其以下列格式显示?:

2 | user_name |green
2 | user_name |red

第三列中的CSV值数量因记录而异。

1 个答案:

答案 0 :(得分:2)

我不确定要使用的mysql语法,如果这在mysql中甚至可能,但我知道它可能在SQL Server(tsql)中,因为我之前已经完成了(没有...我没有代码了)。

高级别流程。

  1. 基于逗号分割字符串的功能(应该可以使它更通用)。该函数应该返回一个表(如果可能的话,可以是变量,也可以在某处写入临时表,也可以返回临时表的名称)。

  2. 每个CSV项的临时表为1行

  3. 然后,您可以使用此临时表加入您的数据集,以获得您想要的内容。

  4. 这必须写在我想象的存储过程中。我敢打赌,这也是一种在递归CTE中实现它的方法。

  5. 我的TSQL分割功能的代码如下。你看我传入了一个join_value变量,它可能是你的用户名。

    ALTER FUNCTION [common].[split_string](@String varchar(8000), @Delimiter char(1), @join_value bigint)     
    returns @temptable TABLE (items varchar(8000), join_value bigint)     
    as     
    begin     
        declare @idx int     
        declare @slice varchar(8000)     
    
        select @idx = 1     
            if len(@String)<1 or @String is null  return     
    
        while @idx!= 0     
        begin     
            set @idx = charindex(@Delimiter,@String)     
            if @idx!=0     
                set @slice = left(@String,@idx - 1)     
            else     
                set @slice = @String     
    
            if(len(@slice)>0)
                insert into @temptable(items, join_value) values(rtrim(ltrim(@slice)), @join_value)     
    
            set @String = right(@String,len(@String) - @idx)     
            if len(@String) = 0 break     
        end 
    return     
    end