使用 EXTRACTVALUE(或其他方法)在 Oracle sQL 中提取特定子节点

Extracting a specific child node in Oracle sQL with EXTRACTVALUE (or other methods)

提问人:user3570049 提问时间:11/2/2023 最后编辑:Alex Pooleuser3570049 更新时间:11/2/2023 访问量:32

问:

编写查询以分析 XML clob,并且需要返回节点 = 375 的特定子节点。有问题的 XML:

表是F1_MKTMSG_IN_DATA 列为 MKTMSG_ID,其中包含以下 XML(示例记录)

<root>
<MKT_MSG_DATA>
  <receivedDetail>
    <rpdtGrp>
      <rpdt>
        <rpdt>375</rpdt>
        <rpd>2023-11-05</rpd>
      </rpdt>
      <rpdt>
        <rpdt>656</rpdt>
        <rpd>2023-11-05</rpd>
      </rpdt>
      <rpdt>
        <rpdt>MRR</rpdt>
        <rpd>2023-11-05</rpd>
      </rpdt>
    </rpdtGrp>
    <rpdrGrp/>
    <rpaGrp/>
    <mdlGrp/>
    <udlGrp/>
    <cdGrp/>
  </receivedDetail>
</MKT_MSG_DATA>
</root>

我需要选择 <rpd>2023-11-05</rpd>其中 <rpdt> = 375。由于我不相信它实际上是父级,我想我只需要获取包含 rpdt = 375 的 rpdt 父级,然后从中获取 rpd 值,但我不确定 EXTRACTVALUE 是否具有该功能?

我试过使用

select EXTRACTVALUE(XMLTYPE('<root>' || MKT_MSG_DATA || '</root>'), 'root/MKT_MSG_DATA/receivedDetail/rpdtGrp[1]/rpdt[1]/rpd[1]') FROM F1_MKTMSG_IN_DATA

这将使我获得正确的值,但只有当xml按该特定顺序时,我才能确定它是否始终按该顺序出现,因此我需要它来实际找到特定值。我听说 extractvalue 早已被弃用,所以我更喜欢使用其他东西

SQL XML Oracle XPath

评论


答:

0赞 Alex Poole 11/2/2023 #1

您可以更改 XPath 以筛选子节点值:

'root/MKT_MSG_DATA/receivedDetail/rpdtGrp/rpdt[rpdt="375"]/rpd'

我不确定你为什么要添加节点;您的示例值已经有它,但您的真实数据可能没有 - 但由于它本身就是一个有效的片段,因此添加似乎并没有真正实现任何目标。rootMKT_MSG_DATAroot

另请注意,它已被弃用很长时间,您可以改用:EXTRACTVALUEXMLQuery

select xmlquery('/MKT_MSG_DATA/receivedDetail/rpdtGrp/rpdt[rpdt="375"]/rpd/text()'
    passing XMLType(MKT_MSG_DATA)
    returning content).getStringVal() as result
from F1_MKTMSG_IN_DATA

如果需要,您可以将返回的值转换为本机日期。

或者你可以使用 XMLTable,它对于一次获取多个值很方便,但也可以很容易地将数据转换为正确的类型:

select x.rpd
from F1_MKTMSG_IN_DATA
cross apply XMLTable('/MKT_MSG_DATA/receivedDetail/rpdtGrp/rpdt[rpdt="375"]'
  passing XMLType(MKT_MSG_DATA)
  columns rpd date path 'rpd'
) x

小提琴