在 Oracle 查询中连接 XMLType 节点
Posted
技术标签:
【中文标题】在 Oracle 查询中连接 XMLType 节点【英文标题】:Concatenate XMLType nodes in Oracle query 【发布时间】:2019-08-23 15:01:30 【问题描述】:我有一个包含 XML 类型数据的 CLOB 列。例如 XML 数据是:
<A><B>123</b><C>456</C><B>789</b></A>
我试过concat
函数:
concat(xmltype (a.xml).EXTRACT ('//B/text()').getStringVal (),';'))
或
xmltype (a.xml).EXTRACT (concat('//B/text()',';').getStringVal ()))
但他们给出的是“;”最后不是在每个<B>
标签之后。
我正在使用
xmltype (a.xml).EXTRACT ('//B/text()').getStringVal ()
我想将所有<B>
与;
连接起来,预期结果应该是123;789
请建议我如何连接我的数据。
【问题讨论】:
【参考方案1】:concat()
SQL 函数连接两个值,因此它只是将分号独立地附加到每个提取的值上。但是您确实在尝试对结果进行字符串聚合(可能实际上是两个以上提取的值)。
您可以使用 XMLQuery 代替提取,并使用 XPath string-join()
函数进行连接:
XMLQuery('string-join(/A/B, ";")' passing xmltype(a.xml) returning content)
带有固定 XMl 端节点标签的演示:
-- CTE for sample data
with a (xml) as (
select '<A><B>123</B><C>456</C><B>789</B></A>' from dual
)
-- actual query
select XMLQuery('string-join(/A/B, ";")' passing xmltype(a.xml) returning content) as result
from a;
RESULT
------------------------------
123;789
您还可以使用 XMLTable 提取所有单独的 <B>
值,然后使用 SQL 级聚合:
-- CTE for sample data
with a (xml) as (
select '<A><B>123</B><C>456</C><B>789</B></A>' from dual
)
-- actual query
select listagg(x.b, ';') within group (order by null) as result
from a
cross join XMLTable('/A/B' passing xmltype(a.xml) columns b number path '.') x;
RESULT
------------------------------
123;789
这为您提供了更大的灵活性,并且可以更轻松地按其他节点值进行分组,但根据您的示例值,这里似乎不需要这样做。
【讨论】:
以上是关于在 Oracle 查询中连接 XMLType 节点的主要内容,如果未能解决你的问题,请参考以下文章