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

How to use different paths for single column in 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 我正在尝试解析并获取值标记内的内容。

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

  1. 1级
  2. level2
  3. 3级

角色=EX,资质=level1的情况

那我要读取对应值标签的内容。这里 value 标签的值为 33.

当角色=CR 且资格=level2 则价值=level2

目前,我正在阅读 Id[1]/Qualification、Id[2]/Qualification 值并编写 case 语句来匹配此条件。有没有办法为 XML 表中的单个列定义多个路径(借助 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