如何解决如何在 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>
-
角色标签的值可以是
- EX,CR,AJ.
其他两个 id 标签中的 Qualification 标签可以有三个值:
- level1
- level2
- 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 举报,一经查实,本站将立刻删除。