【问题标题】:PL/SQL equivalent of T-SQL set-oriented variable concatenationPL/SQL 等价于 T-SQL 面向集合的变量连接
【发布时间】:2020-09-02 19:26:23
【问题描述】:

在 Microsoft SQL Server (T-SQL) 中,有一种简洁、优雅和高性能的面向集合的方式来使用表中多行值的串联填充 VARCHAR 变量,即:

DECLARE @vals NVARCHAR(MAX)
SELECT @vals = ISNULL(@vals + ',', '')
+ <some_varchar_column>
FROM <some_table>

使用逗号分隔的字符串填充@vals,该字符串来自some_table 的所有行中的some_column 中的所有值(例如,“value1,value2,value3, ...”)。

如何以同样优雅的方式在 Oracle PL/SQL 中执行类似操作(无需编写循环/光标)?

【问题讨论】:

    标签: sql oracle plsql string-aggregation


    【解决方案1】:

    这个?

    SQL> select listagg(dname, ',') within group (order by dname) result
      2  from dept;
    
    RESULT
    -------------------------------------------------------------------------
    ACCOUNTING,OPERATIONS,RESEARCH,SALES
    
    SQL>
    

    【讨论】:

      【解决方案2】:

      有时实现自己的功能是有意义的。这真的很容易(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                          
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        • 2013-06-24
        • 1970-01-01
        • 2010-11-10
        • 2020-03-28
        • 1970-01-01
        相关资源
        最近更新 更多