You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle SQL XMLAGG转义问题:替代LISTAGG突破字符限制

Oracle XMLAGG聚合JSON字符串时双引号转义问题解决

问题根源

你用XMLAGG替代LISTAGG解决4000字符限制,但XML会自动转义双引号这类特殊字符,所以输出里才会出现"这种实体编码,和预期的JSON格式不符。

修复后的SQL

直接用XMLPARSE处理原始字符串,避免XML的自动转义逻辑,修改后的语句如下:

SELECT 
    '[' || RTRIM(
        XMLAGG(
            XMLPARSE(CONTENT cte.A || ' , ' WELLFORMED) 
            ORDER BY cte.N
        ).getclobval(),
        ' , '
    ) || ']' AS aggr_lsts
FROM cte;

为什么这样有效?

原来的XMLELEMENT(e, ...).extract(...)会把字符串当作XML元素的内容,自动转义双引号、&等字符。而XMLPARSE(CONTENT ... WELLFORMED)是把输入字符串当作完整的XML内容解析,你的JSON字符串本身不会破坏XML结构,所以能完整保留原始的双引号和格式。

关于XMLCAST的疑问

XMLCAST是用来把XML类型转换成普通SQL类型(比如VARCHAR2、CLOB)的工具,它解决不了转义问题。要避免转义,得在构建XML内容的时候就阻止转义,而不是事后转换,所以XMLCAST不是你需要的解决方案。

和LISTAGG输出的一致性

只要你的原始数据里没有<、>、&这类XML特殊字符,这个方案的输出和LISTAGG完全一致:

  • 排序规则相同(按cte.N排序)
  • 分隔符完全一致(' , ')
  • 原始JSON字符串的所有字符(包括双引号、空值)都完整保留

唯一的区别是LISTAGG返回VARCHAR2(最多4000字符),这个方案返回CLOB,支持超长的聚合结果,完美解决长度限制问题。

内容的提问来源于stack exchange,提问作者Mixter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:30:46