【问题标题】:String Aggregation without using ListAgg -- SIMPLE ANSWER (Oracle) [duplicate]不使用 ListAgg 的字符串聚合——简单的答案(Oracle)[重复]
【发布时间】:2015-05-29 12:43:12
【问题描述】:

有没有不使用 ListAgg 进行字符串聚合的简单方法?我是 Oracle 的新手,我试图使用 ListAgg 函数,但它不起作用。我想我安装的版本与 ListAgg 不兼容。我基本上是在尝试以下操作:

实际列表:

Encounter ID  CPT Code  
------------  ---------
123           21556
124           21554
123           92145
123           92542

输出:

Encounter ID  CPT Code  
------------  ---------
123           21556,92145,92542
124           21554

【问题讨论】:

  • 嗯,你用的是什么版本?,你得到的错误信息是什么?
  • 看看WM_CONCAT函数here

标签: sql string oracle aggregation


【解决方案1】:

这是Tom Kyte's version of Stragg,他不再使用它,因为 listagg 更有效。这将聚合长达 4000 个字符的字符串。您必须有权在 your_schema 中创建类型和函数。分隔符无法动态更改,但我将其留作练习。

用法:select dept_no, stragg(emp_name) from emp group by dept_no;

create or replace type Your_schema.stragg_type as object
(
  string varchar2(4000),

  static function ODCIAggregateInitialize
    ( sctx in out stragg_type )
    return number ,

  member function ODCIAggregateIterate
    ( self  in out stragg_type ,
      value in     varchar2
    ) return number ,

  member function ODCIAggregateTerminate
    ( self        in  stragg_type,
      returnvalue out varchar2,
      flags in number
    ) return number ,

  member function ODCIAggregateMerge
    ( self in out stragg_type,
      ctx2 in     stragg_type
    ) return number
);
/

create or replace type body Your_schema.stragg_type
is

  static function ODCIAggregateInitialize
  ( sctx in out stragg_type )
  return number
  is
  begin

    sctx := stragg_type( null ) ;

    return ODCIConst.Success ;

  end;

  member function ODCIAggregateIterate
  ( self  in out stragg_type ,
    value in     varchar2
  ) return number
  is
  begin

    self.string := self.string || ',' || value ;

    return ODCIConst.Success;

  end;

  member function ODCIAggregateTerminate
  ( self        in  stragg_type ,
    returnvalue out varchar2 ,
    flags       in  number
  ) return number
  is
  begin

    returnValue := ltrim( self.string, ',' );

    return ODCIConst.Success;

  end;

  member function ODCIAggregateMerge
  ( self in out stragg_type ,
    ctx2 in     stragg_type
  ) return number
  is
  begin

    self.string := self.string || ctx2.string;

    return ODCIConst.Success;

  end;

end;
/

create or replace function Your_schema.stragg
  ( input varchar2 )
  return varchar2
  deterministic
  parallel_enable
  aggregate using stragg_type
;
/

【讨论】:

    猜你喜欢
    • 2011-03-23
    • 2013-06-23
    • 1970-01-01
    • 2016-01-14
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    相关资源
    最近更新 更多