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

plicqrtu  于 2023-11-17  发布在  Oracle
关注(0)|答案(1)|浏览(132)

编写一个查询来解析一个XML clob,需要返回一个特定的子节点,其中一个节点= 375。
表是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是否有这种能力?
我试过用
第一个月
这将使我得到正确的值,但只有当xml是在特定的顺序,我不能肯定,如果它将永远在该顺序,所以我需要它来实际查找特定的值。

7z5jn7bk

7z5jn7bk1#

您可以更改筛选器以根据子节点值进行筛选:

'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


如果需要,您可以将返回值转换为本地日期。
或者你可以使用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


fiddle

相关问题