有几种方法可以做到这一点。我建议的一种方法是将逗号分隔列表中的数据拆分为多行。
由于您使用的是 SQL Server,因此您可以实现递归 CTE 来拆分数据,然后应用 PIVOT 函数来创建所需的列。
;with cte (id, NameItem, Name, textItem, text) as
(
select id,
cast(left(Name, charindex(',',Name+',')-1) as varchar(50)) NameItem,
stuff(Name, 1, charindex(',',Name+','), '') Name,
cast(left(text, charindex(',',text+',')-1) as varchar(50)) textItem,
stuff(text, 1, charindex(',',text+','), '') text
from yt
union all
select id,
cast(left(Name, charindex(',',Name+',')-1) as varchar(50)) NameItem,
stuff(Name, 1, charindex(',',Name+','), '') Name,
cast(left(text, charindex(',',text+',')-1) as varchar(50)) textItem,
stuff(text, 1, charindex(',',text+','), '') text
from cte
where Name > ''
and text > ''
)
select id, SID, DOB
into table1
from
(
select id, nameitem, textitem
from cte
where nameitem in ('SID', 'DOB')
) d
pivot
(
max(textitem)
for nameitem in (SID, DOB)
) piv;
请参阅SQL Fiddle with Demo。递归版本会很好用,但如果你有一个大数据集,你可能会遇到一些性能问题,所以你也可以使用用户定义的函数来拆分数据:
create FUNCTION [dbo].[Split](@String1 varchar(MAX), @String2 varchar(MAX), @Delimiter char(1))
returns @temptable TABLE (colName varchar(MAX), colValue varchar(max))
as
begin
declare @idx1 int
declare @slice1 varchar(8000)
declare @idx2 int
declare @slice2 varchar(8000)
select @idx1 = 1
if len(@String1)<1 or @String1 is null return
while @idx1 != 0
begin
set @idx1 = charindex(@Delimiter,@String1)
set @idx2 = charindex(@Delimiter,@String2)
if @idx1 !=0
begin
set @slice1 = left(@String1,@idx1 - 1)
set @slice2 = left(@String2,@idx2 - 1)
end
else
begin
set @slice1 = @String1
set @slice2 = @String2
end
if(len(@slice1)>0)
insert into @temptable(colName, colValue) values(@slice1, @slice2)
set @String1 = right(@String1,len(@String1) - @idx1)
set @String2 = right(@String2,len(@String2) - @idx2)
if len(@String1) = 0 break
end
return
end;
然后您可以使用 CROSS APPLY 来获取每一行的结果:
select id, SID, DOB
into table1
from
(
select t.id,
c.colname,
c.colvalue
from yt t
cross apply dbo.split(t.name, t.text, ',') c
where c.colname in ('SID', 'DOB')
) src
pivot
(
max(colvalue)
for colname in (SID, DOB)
) piv;
请参阅带有演示的 SQL Fiddle