读书人

sql列拆分(着急)

发布时间: 2013-01-11 11:57:35 作者: rapoo

sql列拆分(着急,在线等...)
数据库存的数据:

id 备注内容
id1$2012-3-4与会哦$2012-12-25::2012-3-4农民军
id2$2012-12-25::2012-3-4风格化$2012-12-25::2012-3-4如图一3
id2$2012-12-25::2012-3-4拉卡$ghjjhj$2012-3-4如图一$2013-3-4::v南京化工

想得到如下结果:

id 时间 内容 时间 内容 时间 内容
id1 2012-3-4与会哦 2012-12-25 2012-3-4农民军
id2 2012-12-25 2012-3-4风格化 2012-12-25 2012-3-4如图一3
id3 2012-12-25 2012-3-4拉卡 2012-3-4如图一 2013-3-4 v南京化工

就是对每条数据的[备注内容] 列 以 "$" 拆分,拆分后的数据再以"::"拆分

比如:
id1 这条数据,以"$" 拆分后为:
2012-3-4与会哦
2012-12-25::2012-3-4农民军
然后再以"::" 拆分后应为:

时间 内容
2012-3-4与会哦
2012-12-25 2012-3-4农民军

总的来说就是对 备注内容 列拆分:以"$" 拆分后的数据包括时间和内容,如果这条数据里又有"::" 则时间为左侧内容,如果没有"::" 则时间为空,
并且 [备注内容] 这列的数据以"$" 拆分后 的个数有多又少,所以最后结果拆分出的列数也是不固定的
求大侠帮帮我啊,谢谢了~
[解决办法]
用substring和charindex就可以搞定了
[解决办法]

USE test
GO



-->生成表tb

if object_id('tb') is not null
drop table tb
Go
Create table tb([id] nvarchar(3),[备注内容] nvarchar(58))
Insert into tb
Select N'id1',N'$2012-3-4与会哦$2012-12-25::2012-3-4农民军'
Union all Select N'id2',N'$2012-12-25::2012-3-4风格化$2012-12-25::2012-3-4如图一3'
Union all Select N'id2',N'$2012-12-25::2012-3-4拉卡$ghjjhj$2012-3-4如图一$2013-3-4::v南京化工'

Go


--- statement:

DECLARE @sql NVARCHAR(MAX)

DECLARE @ TABLE (id NVARCHAR(50),tmp_comment NVARCHAR(200),comment AS CASE WHEN CHARINDEX('::',tmp_comment)=0 THEN '::' ELSE '' END+tmp_comment )

SELECT @sql=ISNULL(@sql+' Union all ','')+'Select N'''+id+''' As id,N'''+REPLACE(REPLACE('^'+备注内容,'^$',''),'$',''' Union all Select N'''+LTRIM(id)+''' As id,N''')+'''' FROM tb

INSERT INTO @(id,tmp_comment)
Exec (@sql)


SET @sql=NULL

SELECT @sql=ISNULL(@sql+' Union all ','')+'Select N'''+id+''' As id,N'''+REPLACE(comment,'::',N''' As [时间],N''')+N''' As [内容]' FROM @

Exec (@sql)


--- Result:
/*
id 时间 内容
---- ---------- ------------
id1 2012-3-4与会哦


id1 2012-12-25 2012-3-4农民军
id2 2012-12-25 2012-3-4风格化
id2 2012-12-25 2012-3-4如图一3
id2 2012-12-25 2012-3-4拉卡
id2 ghjjhj
id2 2012-3-4如图一
id2 2013-3-4 v南京化工
*/


[解决办法]
我不理解存储的数据为什么设计成这样?
虽然能处理,但是数量大的时候,效率很差。
SQL SERVER是关系型数据库,既然有列的概念,存储的时候建议把数据正规化一些。
毕竟数据库是用来存储数据的,里面不适合做逻辑上的处理。
[解决办法]
USE test
GO

-->生成表tb

if object_id('tb') is not null
drop table tb
Go
Create table tb([id] nvarchar(3),[时间] NVARCHAR(50),[内容] nvarchar(50))
Insert into tb
Select N'id1','2012-3-4',N'与会哦'
Union all Select N'id1','2012-12-25',N'2012-3-4农民军'
Union all Select N'id2','2012-3-7',N'与会哦'
Union all Select N'id2','2012-3-8',N'与会哦2'
Union all Select N'id2','2012-3-9',N'与会哦3'
Union all Select N'id3','2012-12-22',N'2012-3-4农民军2'




DECLARE @sql NVARCHAR(MAX),@max_cnt INT


SELECT @max_cnt=MAX(cnt) FROM (SELECT COUNT(1) AS cnt FROM tb GROUP BY id) t

SELECT
@sql=ISNULL(@sql+' UNION ALL ','')
+'SELECT N'''+LTRIM(id)+''' As id'
+(SELECT
',N'''+x.[时间]+N''' As [时间],N'''+x.[内容]+N''' As [内容]'
FROM tb AS x
WHERE x.id=a.id
FOR XML PATH(''))
+REPLICATE(N','''' As [时间],'''' As [内容]',@max_cnt-COUNT(1))
FROM tb AS a
GROUP BY id

EXEC (@sql)


/*
id 时间 内容 时间 内容 时间 内容
---- ---------- ------------ ---------- ----------- -------- ----
id1 2012-3-4 与会哦 2012-12-25 2012-3-4农民军
id2 2012-3-7 与会哦 2012-3-8 与会哦2 2012-3-9 与会哦3
id3 2012-12-22 2012-3-4农民军2
*/

Go

读书人网 >SQL Server

热点推荐