日期:2014-05-17  浏览次数:20529 次

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 &