一个字符串
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级以上。求各路高手指点。
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级以上。求各路高手指点。
@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;;
膜拜中,强,说实话,有点看不太懂 如何把他封成函数,我只需要传一个 编号2714,与字符jobsort::2714,2714,0210,0014,2714;;进去就行
谢谢天笑我把这个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::',';;',',')