oracle listagg()/xmlagg()函数使用

listagg()函数

格式

select listagg(字段1,‘分隔符’) within group(order by 字段2 [asc/desc]) from table [where]

名词解释

  • 字段1:需要合并的字段
  • 分隔符:用什么符号进行分割。一般的有:逗号(,)、句号(。)、分号(;)等。
  • 字段2:排序

实例

select listagg(sname,‘;’) within group(order by chengji) from chengjibiao where sid>10 and sid <20;

注意

使用了listagg()函数后,该sql语句为聚合语句,只能使用聚合函数
当拼接后的字符长度超过4000(即一个varchar2)的长度后,查询就会报错,需要使用xmlagg()函数拼接,然后转换成clob字段输出

xmlagg()

格式

  1. xmlagg(xmlparse(content 列名||‘分隔符’) order by 列名).getclobval()
    注意:xmlparse()这个函数可能会无效(起码我试过无效)
  2. xmlagg(xmlelement(要拼接的东西).extract(‘//text()’) order by xxx).getclobval()
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle中,如果使用listagg函数拼接的记录太多,会导致返回的字符串长度过长,从而报错。这是因为listagg函数返回的类型为varchar,最大长度为4000。当长度超过4000时,会报错ora-01489 result of String concatenation is too long。为了解决这个问题,可以使用以下两种方法: 1.使用XMLAGG函数代替listagg函数,将结果转换为XML格式,然后再将XML转换为字符串。这种方法可以避免字符串长度过长的问题,但是需要进行额外的转换操作,可能会影响性能。 ```sql SELECT RTRIM(XMLAGG(XMLELEMENT(E, column_name, ',')).EXTRACT('//text()'),',') AS column_names FROM table_name; ``` 2.使用自定义聚合函数来代替listagg函数,这种方法可以自定义返回类型和最大长度,从而避免字符串长度过长的问题。 ```sql CREATE OR REPLACE TYPE string_agg_type AS OBJECT ( total VARCHAR2(32767), STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT string_agg_type) RETURN NUMBER, MEMBER FUNCTION ODCIAggregateIterate(self IN OUT string_agg_type, value IN VARCHAR2) RETURN NUMBER, MEMBER FUNCTION ODCIAggregateTerminate(self IN string_agg_type, returnValue OUT VARCHAR2, flags IN NUMBER) RETURN NUMBER, MEMBER FUNCTION ODCIAggregateMerge(self IN OUT string_agg_type, ctx2 IN string_agg_type) RETURN NUMBER ); / CREATE OR REPLACE TYPE BODY string_agg_type IS STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT string_agg_type) RETURN NUMBER IS BEGIN sctx := string_agg_type(NULL); RETURN ODCIConst.Success; END; MEMBER FUNCTION ODCIAggregateIterate(self IN OUT string_agg_type, value IN VARCHAR2) RETURN NUMBER IS BEGIN IF (self.total IS NULL) THEN self.total := value; ELSE self.total := self.total || ',' || value; END IF; RETURN ODCIConst.Success; END; MEMBER FUNCTION ODCIAggregateTerminate(self IN string_agg_type, returnValue OUT VARCHAR2, flags IN NUMBER) RETURN NUMBER IS BEGIN returnValue := self.total; RETURN ODCIConst.Success; END; MEMBER FUNCTION ODCIAggregateMerge(self IN OUT string_agg_type, ctx2 IN string_agg_type) RETURN NUMBER IS BEGIN IF (ctx2.total IS NOT NULL) THEN IF (self.total IS NULL) THEN self.total := ctx2.total; ELSE self.total := self.total || ',' || ctx2.total; END IF; END IF; RETURN ODCIConst.Success; END; END; / CREATE OR REPLACE FUNCTION string_agg(input VARCHAR2, max_length NUMBER) RETURN VARCHAR2 PARALLEL_ENABLE AGGREGATE USING string_agg_type; ``` 使用自定义聚合函数的示例: ```sql SELECT string_agg(column_name, 4000) AS column_names FROM table_name; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值