一个字符串
degree_id2::06,2714;;jobsort::2714,2714,3003,0210,0014;;major_type::2714;;我需要把 jobsort::2714,2714,3003,0210,0014;; 我想看这一段中有没有两个相同的编号 2714 如果有去掉其中一个并去掉一个分隔符,让他变成如下这种:jobsort::2714,3003,0210,0014;;如何实现?补充说明: jobsort::2714,2714,3003,0210,0014;; 这里面的编号2714是乱序的 有可能是这几种情况jobsort::2714,3003,0210,0014,2714;; --一个在最前面,一个在最后面 要变成 jobsort::2714,3003,0210,0014;; 或者jobsort::3003,0210,0014,2714;;
jobsort::2714,3003,0210,2714,0014;;--一个在最前面,一个在中间 要变成 jobsort::2714,3003,0210,0014;; 或者jobsort::3003,0210,2714,0014;;
jobsort::3003,2714,0210,0014,2714;;--一个在中间,一个在最后 要变成 jobsort::3003,0210,0014,2714;; 或者jobsort::3003,2714,0210,0014;;
jobsort::2714,2714,0210,0014,2714;;--最前面,中间,最后,都有,而且个数有可能多个,但多不超过五个。
要变成 jobsort::2714,0210,0014;; 或者jobsort::0210,0014,2714;;描述的应该很清楚吧!不要求性能,一个编号只执行一次,数据量在10W级以上。求各路高手指点。

解决方案 »

  1.   

    jobsort::2714,2714,0210,0014,2714;; 变成 jobsort::0210,0014,2714;; 如果 2714 只有一个就不用变了
      

  2.   

    declare @s varchar(1024),
    @s2 varchar(1024),
    @s3 varchar(1024)
    set @s = 'jobsort::2714,2714,0210,0014,2714;;'
    set @s2 = substring(@s,charindex('::',@s)+2,charindex(';;',@s)-charindex('::',@s)-2)
    declare @t table (id int,name varchar(1024))
    insert into @t 
    select 1, @s2;with T (id,P1,P2) as
    (
        select id,charindex(',',','+name),charindex(',',name+',')+1 from @t
        union all
        select a.id,b.P2,charindex(',',name+',',b.P2)+1 
        from @t a join T b on a.id=b.id where charindex(',',name+',',b.P2)>0
    ),T2 as(
    select  distinct name=substring(a.name+',',b.P1,b.P2 - b.P1 - 1) from @t a join T b on a.id=b.id  
    )select @s3=isnull(@s3+',' , '')+name from T2
    print  replace(@s,@s2,@s3)---------------------------------------
    (1 行受影响)(1 行受影响)(1 行受影响)
    jobsort::0014,0210,2714;;
      

  3.   


    膜拜中,强,说实话,有点看不太懂 如何把他封成函数,我只需要传一个 编号2714,与字符jobsort::2714,2714,0210,0014,2714;;进去就行 
      

  4.   

    这个Sql 很强大 
    谢谢天笑我把这个Sql封装成了涵数,分享给大家--@input nvarchar(500) 要处理的字符串 degree_id2::06,2714;;jobsort::2714,2714,3003,0210,0014;;major_type::2714;;
    --@begin varchar(20) 开始字符 jobsort::
    --@end varchar(20) 结束字符 ;;  0014后面的符号
    --@separator varchar(10) 分隔符 ,
    --return 返回结果 字符串 degree_id2::06,2714;;jobsort::0014,0210,2714,3003;;major_type::2714;;
    create function dbo.func_DistinctReplace(@input nvarchar(500),@begin varchar(20),@end varchar(20),@separator varchar(10))
    returns varchar(500)
    as
    begin
    declare @s2 varchar(100),@s3 varchar(100),@result varchar(500);
    set @s2 = substring(@input,charindex(@begin,@input)+len(@begin),charindex(@end,@input,charindex(@begin,@input))-charindex(@begin,@input)-len(@begin));
    declare @t table (id int,name varchar(100));
    insert into @t
    select 1, @s2;
    with T (id,P1,P2) as
    (
    select id,charindex(@separator,@separator+name),charindex(@separator,name+@separator)+1 from @t
    union all
    select a.id,b.P2,charindex(@separator,name+@separator,b.P2)+1 
    from @t a join T b on a.id=b.id where charindex(@separator,name+@separator,b.P2)>0
    ),T2 as(
    select  distinct name=substring(a.name+@separator,b.P1,b.P2 - b.P1 - 1) from @t a join T b on a.id=b.id  
    )
    select @s3=isnull(@s3+@separator , '')+name from T2;
    set @result = replace(@input,@s2,@s3);

    return @result;
    endselect dbo.func_DistinctReplace('degree_id2::06,2714;;jobsort::2714,2714,3003,0210,0014;;major_type::2714;;','jobsort::',';;',',')