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

  • Post author:
  • Post category:其他






功能


:


提供字符串的替代聚合函数





说明


:


例如


,


将下列数据


–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








版权声明:本文为hyde100原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。