字符串聚合函数(去除重复值)

--功能:提供字符串的替代聚合函数

--说明:例如,将下列数据

--test_id  test_value

--------------------

'a'        '01,03,04'

'a'        '02,04'

'b'        '03,04,08'

'b'        '06,08,09'

'c'        '09'

'c'        '10'

--转换成test_vlaue列聚合后的函数,且聚合后的字符串中的值不重复

 

--test_id  test_value

--------------------

'a'        '01,03,04,02'

'b'        '03,04,08,06,09'

'c'        '09,10'

 

--代码-------------------------------------------GO

GO

if object_id(N'dbo.merge',N'FN') is not null

    drop function dbo.merge

GO

--函数功能:字符串聚合及去除重复值

create function dbo.merge

(

    @test_id varchar(50)

)

returns varchar(50)

as

begin

    --字符串聚合-------------------------START

    declare @s varchar(8000)

    set @s = ''

 

    select

       @s = @s + test_value + ','

    from test_a

    where test_id = @test_id

    --字符串聚合-------------------------END

 

    --去除重复值-------------------------START

    declare @value varchar(8000)--存储第一个逗号前的值

    declare @result varchar(8000)--存储唯一值的中间字符串

    set @result = ''

   

    --有值的场合

    while charindex(',',@s) <> 0

    begin

       --取第一个逗号前的值

       set @value = left(@s,charindex(',',@s) -1)

 

       --第一个逗号前的值没在结果中出现

       if charindex(',' + @value + ',',',' + @result) = 0

       begin

           --加入中间字符串

           set @result = @result + @value + ','

       end

      

       --去除第一个值以及后面的逗号(剔除法),继续循环判断

       set @s = right(@s,(len(@s) - charindex(',',@s)))

    end

 

    set @s = @result

    --去除重复值-------------------------END

   

    return left(@s,len(@s)-1)

end

GO

 

if object_id(N'test_a',N'U') is not null

    drop table test_a

GO

 

create table test_a

(

    test_id varchar(50),

    test_value varchar(50)

)

 

insert into test_a

select 'a','01,03,04' union all

select 'a','02,04' union all

select 'b','03,04,08' union all

select 'b','06,08,09' union all

select 'c','09' union all

select 'c','10'

 

select

    test_id,

    test_value = dbo.merge(test_id)

from test_a

group by test_id 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值