反转为 STRING_AGG
Reverse to STRING_AGG
这是我们正在进一步处理的示例数据。
create table #tmp (id int identity(1,1), na varchar(10),me varchar(10))
insert into #tmp (na,me)
values
('a','t'),
('a','u'),
('a','v'),
('a','w'),
('b','x'),
('b','y'),
('b','z')
select * from #tmp
我的问题是,SQL 服务器的 STRING_AGG
函数是否有任何完全相反的功能?
就像我将 STRING_AGG
与以下代码合并
select na, STRING_AGG(me,',') as me into #tmp1 from #tmp group by na
select * from #tmp1
我需要逆转这个过程,但我不得不使用 CURSOR,所以我正在寻找替代解决方案。
下面是光标代码,以便更好地理解其用途。
declare @na varchar(10)
declare @me varchar(max)
create table #tmp3 (na varchar(10),me varchar(10))
declare dbc cursor for select na, me from #tmp1
open dbc
while 1=1
begin
fetch next from dbc into @na, @me
if @@FETCH_STATUS <> 0
break;
insert into #tmp3 (na,me)
select @na, value
from string_split(@me,',')
end
close dbc
deallocate dbc
select * from #tmp3
--Delete temp table
drop table #tmp
drop table #tmp1
drop table #tmp3
有类似的string_split
可用,例如
对于每个 string_agg
使用 cross apply
我们可以将它们转换回行,
select na,c.value
from
(select na, string_agg(me,',') as me
from #tmp
group by na
) t
cross apply string_split(me, ',') c;
这是我们正在进一步处理的示例数据。
create table #tmp (id int identity(1,1), na varchar(10),me varchar(10))
insert into #tmp (na,me)
values
('a','t'),
('a','u'),
('a','v'),
('a','w'),
('b','x'),
('b','y'),
('b','z')
select * from #tmp
我的问题是,SQL 服务器的 STRING_AGG
函数是否有任何完全相反的功能?
就像我将 STRING_AGG
与以下代码合并
select na, STRING_AGG(me,',') as me into #tmp1 from #tmp group by na
select * from #tmp1
我需要逆转这个过程,但我不得不使用 CURSOR,所以我正在寻找替代解决方案。
下面是光标代码,以便更好地理解其用途。
declare @na varchar(10)
declare @me varchar(max)
create table #tmp3 (na varchar(10),me varchar(10))
declare dbc cursor for select na, me from #tmp1
open dbc
while 1=1
begin
fetch next from dbc into @na, @me
if @@FETCH_STATUS <> 0
break;
insert into #tmp3 (na,me)
select @na, value
from string_split(@me,',')
end
close dbc
deallocate dbc
select * from #tmp3
--Delete temp table
drop table #tmp
drop table #tmp1
drop table #tmp3
有类似的string_split
可用,例如
对于每个 string_agg
使用 cross apply
我们可以将它们转换回行,
select na,c.value
from
(select na, string_agg(me,',') as me
from #tmp
group by na
) t
cross apply string_split(me, ',') c;