首页 > 解决方案 > 如何在 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. 2级
  3. 3级

role=EX, Qualification=level1 的情况

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

当角色 = CR 和资格 = 级别 2 时,值 = 级别 2

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

标签: xmloraclexpathplsqlxmltable

解决方案


假设您的 XML 实际上是格式正确的,并且qualification 和 value 节点确实在一个 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 的修补版本)中可以正常工作;这里是18c 下相同代码的 db<>fiddle

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

推荐阅读