oracle 在SQL中查询XML数据

oknwwptz  于 2023-04-20  发布在  Oracle
关注(0)|答案(1)|浏览(431)

我有一个Oracle数据库,其中有一个XML字段。假设我在表“Party”中有以下字段:
日期时间客人餐
Meal是一个XML字段。当我查询该字段时,可以看到以下内容:

<table name="dinner">
    <row id="1">
        <field name="main">steak</field>
        <field name="side">potatoes</field>
        <field name="dessert">cake</field>
    </row>
</table>

如何设置一个SQL查询,使其将这些单独的XML字段名和值作为单独的列输出。因此,我希望我的输出是:
日期时间客人主侧甜点
我已经研究过XMLQUERY,但是所有给出的例子都涉及到像<Vendor></Vendor>这样的节点名,而不是<field name = "Vendor"></field>

klh5stk1

klh5stk11#

您可以使用XMLTable一次提取多个值,例如:

select p.party_datetime, p.guest, x.main, x.side, x.dessert
from party p
cross apply xmltable(
  '/table/row'
  passing p.meal
  columns
    main varchar2(10) path 'field[@name="main"]',
    side varchar2(10) path 'field[@name="side"]',
    dessert varchar2(10) path 'field[@name="dessert"]'
) x
PARTY_DATETIME嘉宾主要侧面甜点
2023-05-01 19:00:00牛排马铃薯

fiddle
主XPath获取每个row节点,column子句获取具有匹配属性的field值,使用@name="..."进行匹配。
例如,'field[@name="main"]'路径正在查找一个名为field的节点,该节点具有一个名为name的属性,该属性的值为main,并给出该节点的值。在您的示例中,该值为'steak'。
你说meal是“一个XML字段”,所以我假设该列(不是字段)的数据类型是XMLType。如果它实际上是一个字符串(varchar 2或CLOB),那么passing子句将更改为passing XMLType(p.meal)以将其转换为该类型。
(我已经稍微简化为一个日期列,部分原因是除非它是一个带引号的标识符,否则你不能有一个名为日期的列,但主要是因为Oracle日期总是有一个时间组件,所以尝试单独存储日期和时间通常没有意义。当然,你仍然可以在结果集中将单个值格式化为两列。)
您可以在文档中阅读更多关于XMLTable和使用SQL和PL/SQL查询XML数据的内容。

相关问题