• 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文档

    这里主要演示怎么进行聚合和拆分,如果是大量数据不介意这么用, 这主要应用在查询方面。

  • 相关阅读:
    SpringCloud教程第10篇:高可用的服务注册中心(F版本)
    SpringCloud教程第9篇:Sleuth(F版本)
    requests.session保持会话
    Jmeter Constant Throughput Timer 使用
    Jmeter提取响应数据的结果保存到本地的一个文件
    练习2
    练习1
    一道简单的练习题
    Maven下org.junit.Test无法使用
    [转]解决pycharm无法导入本地包的问题(Unresolved reference 'tutorial')
  • 原文地址:https://www.cnblogs.com/MR_ke/p/1674743.html
Copyright © 2020-2023  润新知