在 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 ()))

但他们给出的是“;”最后不是在每个&lt;B&gt; 标签之后。

我正在使用

xmltype (a.xml).EXTRACT ('//B/text()').getStringVal () 

我想将所有&lt;B&gt;; 连接起来,预期结果应该是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 提取所有单独的 &lt;B&gt; 值,然后使用 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 节点的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Pl/SQL:循环通过 XMLTYPE 节点

初识Oracle的XMLType

pl/sql:将 xmltype 转换为节点

拆分 XMLTYPE 以根据条件创建两个 XMLTYPE

BLOB 到 XMLType XML 解析在 oracle 中失败

NHibernate Oracle XMLType 问题