微软BI开拓者数据库专区SQL Server开发 拆分表字段中被分隔的字符串

1  /  1  页   1 跳转 查看:2094

[技术文档] 拆分表字段中被分隔的字符串

拆分表字段中被分隔的字符串

--合并
--生成测试数据
if not object_id('Tab') is null
    drop table Tab
Go
Create table Tab([Col1] int,[Col2] nvarchar(1))
Insert Tab
select 1,N'a' union all
select 1,N'b' union all
select 1,N'c' union all
select 2,N'd' union all
select 2,N'e' union all
select 3,N'f'
Go

如何合并成如下结果,之间论坛有过不止一贴了,这里不再重述
Col1        COl2
----------- ------------
1          a,b,c
2          d,e
3          f

*********************分割线****************************
拆分:

方法1:使用临时表

--生成测试数据
if not object_id('Tab') is null
    drop table Tab
Go
Create table Tab([Col1] int,[COl2] nvarchar(5))
Insert Tab
select 1,N'a,b,c' union all
select 2,N'd,e' union all
select 3,N'f'
Go

if object_id('Tempdb..#Num') is not null
    drop table #Num
go
select top 100 ID=Identity(int,1,1) into #Num from syscolumns a,syscolumns b
Select
    a.Col1,COl2=substring(a.Col2,b.ID,charindex(',',a.Col2+',',b.ID)-b.ID)
from
    Tab a,#Num b
where
    charindex(',',','+a.Col2,b.ID)=b.ID --也可用 substring(','+a.COl2,b.ID,1)=','
/*
Col1        COl2
----------- -----
1          a
1          b
1          c
2          d
2          e
3          f
*/

方法2:使用XML

--生成测试数据

DECLARE @t TABLE( ID INT IDENTITY, data VARCHAR(50))
INSERT INTO @t(data) SELECT 'AA,AB,AC,AD'
INSERT INTO @t(data) SELECT 'BA,BB,BC'
SELECT * FROM @t

DECLARE @t TABLE( ID INT IDENTITY, data VARCHAR(50))
INSERT INTO @t(data) SELECT 'AA,AB,AC,AD'
INSERT INTO @t(data) SELECT 'BA,BB,BC'
SELECT F1.id,
F1.data,
O.splitdata
FROM
(
SELECT *,
cast('<X>'+replace(F.data,',','</X><X>')+'</X>' as XML) as xmlfilter from @t F
)F1
CROSS APPLY
(
SELECT fdata.D.value('.','varchar(50)') as splitdata
FROM f1.xmlfilter.nodes('X') as fdata(D)) O
 

回复:拆分表字段中被分隔的字符串

-- 方法3:使用CTE

DECLARE @t TABLE( ID INT IDENTITY, data VARCHAR(50))
INSERT INTO @t(data) SELECT 'AA,AB,AC,AD';
INSERT INTO @t(data) SELECT 'BA,BB,BC';

with Pos (id, p1, p2) as
(
    select id, charindex(',',','+data), charindex(',',data+',') + 1 from @t
    union all
    select t.id, p2, charindex(',', data+',', p2) + 1 from @t t join Pos p on t.id = p.id where charindex(',', data+',', p2) > 0
)
select t.id, t.data, splitdata = substring(data+',', p1, p2-p1-1) from @t t join Pos p on t.id = p.id order by 1 option (maxrecursion 0)
 
1  /  1  页   1 跳转

版权所有 微软BI开拓者 

Powered by Discuz!NT 2.1.202    Copyright © 2001-2012 Comsenz Inc.
Processed in 0.0937524 second(s) , 4 queries.
返顶部