微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 XMLTABLE Oracle 中为单列使用不同的路径

如何解决如何在 XMLTABLE Oracle 中为单列使用不同的路径

<employees>
<refval>senior</refval>
<employee>
<role>EX</role>
<ID>
<Qualification>leve1</Qualification>
<value>33</value>
<ID>
<ID>
<Qualification>leve2</Qualification>
<value>40</value>
<ID>
</employee>
</employees>

这是我试图解析并获取标签内的内容的 XML。

  • 角色标签的值可以是

      -  EX,CR,AJ.
    

其他两个 id 标签中的 Qualification 标签可以有三个值:

  1. level1
  2. level2
  3. level3

role=EX,Qualification=level1的情况

然后我想读取对应的值标签内容。这里 value 标签的值为 33。

当 role=CR 和 Qualification=level2 时 value=level2

目前,我正在读取 Id[1]/Qualification、Id[2]/Qualification 值并编写 case 语句以匹配此条件。有没有办法为 XMLTable 中的单个列定义多个路径(借助 if 条件和或运算符)?

解决方法

假设您的 XML 实际上格式良好,并且限定和值节点确实在一个 ID 节点下,那么您可以使用多个路径和联合集运算符 |,并且每个路径中的条件不同:>

select x.*
from your_table t
cross join xmltable(
  '/employees/employee[role="EX"]/ID[Qualification="level1"]
    | /employees/employee[role="CR"]/ID[Qualification="level2"]
    | /employees/employee[role="AJ"]/ID[Qualification="level3"]'
  passing t.xml_data
  columns
    role varchar2(2) path './../role',qualificiation varchar2(10) path 'Qualification',value number path 'value'
) x;

主 Xpath 向下到达 ID 节点,因此您可以通过向后返回一级树来获取角色。

SQL Fiddle 使用固定的 XML 和额外的员工来演示来自每个人的数据。

不幸的是,在该版本的 Oracle 中无法正常返回树,但在 12c 及更高版本(可能还有 11gR2 的修补版本)中可以正常工作;这里是db<>fiddle for the same code under 18c

ROLE QUALIFICIATION VALUE
---- -------------- -----
EX   level1            33
CR   level2            41
AJ   level3            53

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。