SQL进阶提升(xml合并拆分详细实例)
今天在网上看到一个关于sql的疑难问题是这样的:
一个数据表里有一个varchar字段
varchar类型的一个字段包含这样的数据33,444,5555
要求把33加89,444加899,5555加8999
其实就是两位数字,三位数字,四位数字中间用逗号隔开这种格式
但是可能会没有第三位,或者第第二,第三位数都没有,只有第一位数。
创建临时表插入数据:
代码
1 create table #T
2 (
3 id int identity(1,1) primary key,
4 data nvarchar(20)
5 )
6
7 insert into #T
8 values('33,444,5555')
9
10 declare @count int
11 set @count=1
12 while(@count<1000)
13 begin
14 insert into #T
15 values('12,123')
16 insert into #T
17 values('33,444,5555')
18 insert into #T
19 values('11')
20 set @count=@count+1
21 end
22 select * from #T
现在用sql2005 xml拆分聚合来进行update,当然可以用简单的sql update比如:
代码
1 update #T set data=(
2 case when len(data)=2 then cast(left(data,2)+89 as varchar)
3 when len(data)=6 then cast(left(data,2)+89 as varchar)+','+cast(substring(data,4,3)+899 as varchar)
4 when len(data)=11 then cast(left(data,2)+89 as varchar)+','+cast(substring(data,4,3)+899 as varchar)+','+cast(substring(data,8,4)+8999 as varchar)
5 else data
6 end
7 )
8
9 select * from #T
xml 来update
拆分:
代码
1 --拆分
2 SELECT A.id, B.data,len(B.data) as len into #TT
3 FROM(
4 SELECT id, [data] = CONVERT(xml,'<root><v>' + REPLACE([data], ',', '</v><v>') + '</v></root>') FROM #T
5 )A
6 OUTER APPLY(
7 SELECT data = N.v.value('.', 'varchar(100)') FROM A.[data].nodes('/root/v') N(v)
8 )B
更新:
1 select * from #TT
2 --更新
3 update #TT set data=data+(
4 case when len=2 then 899
5 when len=3 then 5555
6 when len=4 then 8999
7 else 0
8 end
9 )
合并:
代码
1 update #T set data=
2 (select top 1 data
3 from
4 (
5 select A.id,b.data
6 from
7 (select distinct id from #TT)as a
8 outer apply
9 (
10 select stuff(replace(replace((select data from #TT where id=a.id for xml auto),'<_x0023_TT data="',','),'"/>',''),1,1,'')
11 as data
12 )as b
13 )C
14 where C.id=#T.id)
15
16 select * from #T
17
18 drop table #TT
19 drop table #T
解释:replace((select data from #TT where id=a.id for xml auto),'<_x0023_TT data="',',')
在select data from #TT,(select distinct id from #TT)as a where #TT.id=a.id for xml auto
我们可以看到sql查询的结果如下,那么通过替代把xml属于性标签替代成,号,最后的stuff是去掉第一个逗号。
点开查询结果是一个xml文档
这里主要演示怎么进行聚合和拆分,如果是大量数据不介意这么用, 这主要应用在查询方面。
有错误的地方欢迎大家拍砖,希望交流和共享。