oracle 如何将XMLAGG与WITHIN GROUP和OVER(PARTITION BY)子句一起使用

fnx2tebb  于 2023-06-22  发布在  Oracle
关注(0)|答案(1)|浏览(214)
LISTAGG(abc.id, ',') WITHIN GROUP (ORDER BY abc.id) OVER(PARTITION BY bdd.id) Codes

我想转换这个LISTAGGXMLAGG作为LISTAGG给出错误,如果值达到4000以上的字符。
我尝试了这种方式,但给出语法错误

RTRIM((XMLAGG(XMLELEMENT(e, abc.id || ', ')) WITHIN GROUP (ORDER BY abc.id) OVER(PARTITION BY bdd.id)).extract('//text()').getclobval(), ', ') Codes
uxh89sit

uxh89sit1#

如何使用XMLAGGWITHIN GROUPOVER(PARTITION BY )子句?
总结-您不能,XMLAgg语法不支持这两个子句。
XMLAGG文档:

XMLAgg是聚合函数。
这意味着:

  • XMLAgg不支持WITHIN GROUP语法,ORDER BY子句位于函数的括号内。
  • XMLAgg是一个聚合函数,并且NOT没有其函数的分析版本,因此您不能应用窗口子句并指定PARTITION BY

如果你想把它用作一个聚合函数,那么你可以使用:

SELECT RTRIM(
          XMLAGG(XMLELEMENT(e, abc.id || ', ') ORDER BY abc.id)
            .extract('//text()')
            .getclobval(),
          ', '
       )
       AS Codes
FROM   abc
       INNER JOIN bdd
       ON abc.bid = bdd.id
GROUP BY bdd.id

其中,对于样本数据:

CREATE TABLE abc (id, bid) AS
SELECT LEVEL, 1 FROM DUAL CONNECT BY LEVEL <= 10;

CREATE TABLE bdd (id) AS
SELECT 1 FROM DUAL;

输出:
| 代码|
| - -----|
| 1、2、3、4、5、6、7、8、9、10|
fiddle

相关问题