• oracle中listagg()和wm_concat()基本用法


    作用:

    可以实现将多列记录聚合为一列记录,实现数据的压缩
    declare p_sqltxt varchar(30000);
    p_sql varchar(30000);
    begin
    SELECT ','||wm_concat('BillsOfLading.'||FieldName||' as bo_'||FieldName)
    ,','||wm_concat('BillsOfLading.'||FieldName) into p_sqltxt,p_sql
    FROM CustomFields
    WHERE ClassSetCode = 'BillsOfLading'
    AND ActTable = 'BillsOfLading'
    AND IsDeleted <> '1';
    dbms_output.put_line(p_sqltxt);
    dbms_output.put_line(p_sql);
    end;

    效果:

    ,BillsOfLading.CustomField1 as bo_CustomField1,BillsOfLading.CustomField2 as bo_CustomField2
    ,BillsOfLading.CustomField1,BillsOfLading.CustomField2
    看上去十分的方便,但是遗憾的是,oracle极其不推荐这个函数。
    11gr2和12C上已经摒弃了wm_concat函数。可用listagg替代
    listagg(measure_expr,delimiter) within group ( order by order_by_clause);
    解释:measure_expr可以是基于任何列的表达式
      delimiter分隔符,默认为NULL
      order_by_clause决定了列值的拼接顺序
    declare
      p_sqltxt varchar(30000);
      p_sql    varchar(30000);
    begin
      select listagg('BillsOfLading.' || FieldName || ' as bo_' || FieldName,
                     ',') within group(order by FieldName),
             listagg('BillsOfLading.' || FieldName, ',') within group(order by FieldName)
        into p_sqltxt, p_sql
        from CustomFields
       WHERE ClassSetCode = 'BillsOfLading'
         AND ActTable = 'BillsOfLading'
         AND IsDeleted <> '1';
      dbms_output.put_line(p_sqltxt);
      dbms_output.put_line(p_sql);
    end;

    效果一样。

    sql server 中的对应的方法

     declare @p_sqltxt varchar(1000),
             @p_sql    varchar(1000)
         set @p_sqltxt=' ' --注意赋值之前要对其初始化
         set @p_sql=' '
          select @p_sqltxt=@p_sqltxt+ ','+ 'BillsOfLading.'+FieldName+' as bo_'+FieldName,
                 @p_sql=@p_sql+','+'BillsOfLading.'+FieldName
           from  CustomFields 
      WHERE ClassSetCode = 'BillsOfLading'
             AND ActTable = 'BillsOfLading'
    print @p_sqltxt
    print @p_sql

    效果一样

    注意1 wm_concat 是分组拼接,拼接的是其他不分组的字段,sqlserver的加方式是先分组之后在进行加
    注意2 若没有数据,sqlserver的@groupFields值为' ',oracle的groupFields 会有一个分号,赋值语法不同
  • 相关阅读:
    Docker用途 & 和tomcat的区别
    Ubuntu安装Redis
    Ubuntu查看和设置Root账户
    Oracle常用语句
    Redis知识总结
    Blazor学习笔记01: 使用BootstrapBlazor组件 创建一个具有单表维护功能的表格页面
    NET Core之积沙成塔01: 解决Visual Studio 2019 代码提示为英文
    MySQL系统自带的数据库information schema
    Windows安装mysql方法
    数据库之概念
  • 原文地址:https://www.cnblogs.com/liuyudong0825/p/11906175.html
Copyright © 2020-2023  润新知