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

问题描述 投票:0回答:1

编写一个查询来解析 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>

我需要选择 2023-11-05,其中 = 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 oracle oracle-sqldeveloper
1个回答
0
投票

您可以更改 XPath 以过滤子节点值:

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

我不确定你为什么要添加

root
节点;您的示例值已经具有它,但想必您的真实代码没有 - 但由于
MKT_MSG_DATA
本身就是一个有效的片段,因此添加
root
似乎并没有真正实现任何目标。

另请注意,

EXTRACTVALUE
已被弃用很长一段时间,您可以使用
XMLQuery
代替:

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

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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.