当前位置: 首页 > news >正文

简单数据拆分

/*
标题:简单数据拆分(version 2.0)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2010-05-07
地点:重庆航天职业学院
描述:

有表tb, 如下:
id          value
----------- -----------
1           aa,bb
2           aaa,bbb,ccc
欲按id,分拆value列, 分拆后结果如下:
id          value
----------- --------
1           aa
1           bb
2           aaa
2           bbb
2           ccc
*/

--1. 旧的解决方法(sql server 2000)

create table tb(id int,value varchar(30))
insert into tb values(1,'aa,bb')
insert into tb values(2,'aaa,bbb,ccc')
go

--方法1.使用临时表完成
SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b 

SELECT A.id, value = SUBSTRING(A.[value], B.id, CHARINDEX(',', A.[value] + ',', B.id) - B.id)
FROM tb A, # B
WHERE SUBSTRING(',' + A.[value], B.id, 1) = ','

DROP TABLE #

--方法2.如果数据量小,可不使用临时表
select a.id , value = substring(a.value , b.number , charindex(',' , a.value + ',' , b.number) - b.number) 
from tb a join master..spt_values  b 
on b.type='p' and b.number between 1 and len(a.value)
where substring(',' + a.value , b.number , 1) = ','

--2. 新的解决方法(sql server 2005)
create table tb(id int,value varchar(30))
insert into tb values(1,'aa,bb')
insert into tb values(2,'aaa,bbb,ccc')
go

--方法1.使用xml完成
SELECT A.id, B.value FROM
(
  SELECT id, [value] = CONVERT(xml,'<root><v>' + REPLACE([value], ',', '</v><v>') + '</v></root>') FROM tb
) A OUTER APPLY
(
  SELECT value = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/root/v') N(v)
) B

--方法2.使用CTE完成
;with tt as 
(select id,[value]=cast(left([value],charindex(',',[value]+',')-1) as nvarchar(100)),Split=cast(stuff([value]+',',1,charindex(',',[value]+','),'') as nvarchar(100)) from tb
union all
select id,[value]=cast(left(Split,charindex(',',Split)-1) as nvarchar(100)),Split= cast(stuff(Split,1,charindex(',',Split),'') as nvarchar(100)) from tt where split>''
)
select id,[value] from tt order by id option (MAXRECURSION 0)


DROP TABLE tb

/*
id          value
----------- ------------------------------
1           aa
1           bb
2           aaa
2           bbb
2           ccc

(5 行受影响)
*/


相关文章:

  • Linq error: Sequence contains no elements
  • asp.net mvc中ckeditor+ckfinder的配置方法
  • 详细图解发布aps.net mvc网站项目到IIS的方法
  • 在windows server2003 iis6部署mvc3
  • Linq to SQlite的使用
  • 去掉链接a标签外的虚线框(ff,ie)
  • IE6、IE7、IE8、Firefox兼容性问题
  • 搜集整理的一个c#.net的加密解密的类
  • The server has encountered an error while loading an application during the processing of your reque
  • asp连接mysql
  • ASP+MYSQL:ODBC 驱动程序不支持所需的属性
  • ASP解决方案-Microsoft JET Database Engine(0x80004005)未指定错误
  • 编辑器 img src问题
  • IIS出现server application error
  • IIS7错误:“由于扩展配置问题而无法提供您请求的页面”解决
  • extjs4学习之配置
  • Java基本数据类型之Number
  • Laravel 菜鸟晋级之路
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Promise面试题2实现异步串行执行
  • SegmentFault 2015 Top Rank
  • tab.js分享及浏览器兼容性问题汇总
  • 后端_MYSQL
  • 基于组件的设计工作流与界面抽象
  • 收藏好这篇,别再只说“数据劫持”了
  • 小试R空间处理新库sf
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​什么是bug?bug的源头在哪里?
  • #### go map 底层结构 ####
  • (07)Hive——窗口函数详解
  • (2020)Java后端开发----(面试题和笔试题)
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (剑指Offer)面试题34:丑数
  • (转)linux下的时间函数使用
  • (转)winform之ListView
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .bashrc在哪里,alias妙用
  • .NET Core跨平台微服务学习资源
  • .net操作Excel出错解决
  • .NET连接数据库方式
  • ?.的用法
  • @GlobalLock注解作用与原理解析
  • @Transactional类内部访问失效原因详解
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [22]. 括号生成
  • [Android]Android开发入门之HelloWorld
  • [C语言]编译和链接
  • [GDMEC-无人机遥感研究小组]无人机遥感小组-000-数据集制备
  • [jobdu]不用加减乘除做加法
  • [js]js设计模式小结
  • [Loadrunner参数化]一个文件输两列参数的取值
  • [nginx] LEMP 架构随笔
  • [nlp] 多语言大模型不同语种/语系数据的数据配比调节