zoukankan      html  css  js  c++  java
  • 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 会有一个分号,赋值语法不同
  • 相关阅读:
    Rancher中删除k8s节点数据,还原机器用于重新安装
    k8s、pod中的应用获取宿主机IP、PODIP等信息
    通过物理设备了解Osi网络架构
    el-tree懒加载无子级数据时去掉下拉箭头
    使用axios.all和axios.spread处理并发请求
    element日期控件修改时候显示1970年的问题
    echarts柱状图区域缩放可拖动参数配置
    记录element表格设置右侧固定,边框线消失的问题
    echarts饼图数据为0时隐藏数据指示线
    vue使用moment.js处理时间格式
  • 原文地址:https://www.cnblogs.com/liuyudong0825/p/11906175.html
Copyright © 2011-2022 走看看