如何在 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 我正在尝试解析并获取值标记内的内容。
角色标签的值可以是
- EX, CR, AJ.
其他两个 id 标签中的 Qualification 标签可以有三个值:
- 1级
- level2
- 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
<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级
- level2
- 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