数据库存的数据:
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与会哦