首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

sql列拆分(着急)

2013-01-11 
sql列拆分(着急,在线等...)数据库存的数据:id备注内容id1$2012-3-4与会哦$2012-12-25::2012-3-4农民军id2$

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

热点排行