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
相关产品推荐
相关产品推荐

