xml - 如何在 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级
- 2级
- 3级
role=EX, Qualification=level1 的情况
然后我想读取对应值标签的内容。这里值标签的值为 33。
当角色 = CR 和资格 = 级别 2 时,值 = 级别 2
目前,我正在阅读 Id[1]/Qualification、Id[2]/Qualification 值并编写案例语句以匹配此条件。有没有办法为 XMLTable 中的单个列定义多个路径(借助 if 条件和或运算符)?
解决方案
假设您的 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
推荐阅读
- websphere - IBM ACE - 覆盖基本 URL (RestRequestNod)
- android - Android Volley:为什么这两个请求中的第二个请求超时失败?
- c# - 诊断服务器端 Blazor 内存问题
- redis - Thumbor 不会处理整个图像。底部有一个灰色框
- tableau-api - Tableau Server 对 Snowflake 的自动请求
- linux - 如何使用 shell 脚本在大小为 8gb 的 Linux Ec2 服务器中进行磁盘分区?
- apache-poi - Apache POI:使用 XLSX 文件中的格式化文本创建 DOCX
- jpa - 保存辅助实体时如何保持 oneToOne 关系
- python - 时间演化:scipy.linalg.expm_multiply() 或用 np.linalg.eigh() 对角化?
- flutter - 根据主题为容器使用不同的颜色