问题描述
在Microsoft SQL Server(T-SQL)中,存在一种简洁,优雅且高性能的面向集合的方法,该方法使用表中多个行的值的串联来填充VARCHAR变量,即:
"viewsContainers": {
"activitybar": [
{
"id": "code-review","title": "Code Review","icon": "images/icon-sidebar.svg"
}
]
},"views": {
"code-review": [
{
"id": "code-review.list","name": "Comment Explorer","when": "codeReview:displayCodeReviewExplorer"
}
]
},
用DECLARE @vals NVARCHAR(MAX)
SELECT @vals = ISNULL(@vals + ',','')
+ <some_varchar_column>
FROM <some_table>
的所有行中@vals
中所有值的逗号分隔字符串填充some_column
(例如,“ value1,value2,value3,...”)。 / p>
如何在Oracle PL / SQL中以类似优雅的方式(无需编写循环/游标)来做类似的事情?
解决方法
这吗?
SQL> select listagg(dname,',') within group (order by dname) result
2 from dept;
RESULT
-------------------------------------------------------------------------
ACCOUNTING,OPERATIONS,RESEARCH,SALES
SQL>
,
有时候实现自己的功能很有意义。这真的很容易(db<>fiddle):
select * from vals
/
ID VAL
---------- ---------------------------------------------
1 value1
1 value2
2 value3
2 value4
2 value5
3 value6
create or replace type listofvals is table of varchar2 (64)
/
with function mylistagg (vals listofvals,delimiter char := ',') return varchar2 is
ret varchar2 (32767);
begin
for i in 1..vals.count loop
ret := ret||vals(i)||delimiter; end loop;
return rtrim (ret,delimiter);
end;
select id,mylistagg (cast (collect (val order by val) as listofvals),' -> ') res
from vals
group by id
/
结果:
ID RES
---------- --------------------------------
1 value1->value2
2 value3->value4->value5
3 value6