PL / SQL等效于T-SQL面向集合的变量串联

问题描述

在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                          

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...