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 会有一个分号,赋值语法不同
  • 相关阅读:
    qt 数据库操作总结
    Pro*C编程研究一:从.pc到.exe
    通过OCCI连接oracle(C++)
    数据库操作通用类
    一个数据库操作类,适用于Oracle,ACCESS,SQLSERVER
    如何卸载oracle11g
    ORA-12541:TNS:无监听程序
    Qt 线程基础(QThread、QtConcurrent等) 2
    QThreadPool类和QtConcurrent命名空间
    AE 向已存在的要素类中添加字段
  • 原文地址:https://www.cnblogs.com/liuyudong0825/p/11906175.html
Copyright © 2011-2022 走看看