您好,我是Oracle XML DB的新手,但必须通过另一个属性值来提取属性值。
简化后的文档如下:
<ApplicationDataNotification>
<ApplicationData>
<DataSet Name="A1">
<Data DataElement="PAND" Value="A100"/>
<Data DataElement="MKDI" Value="007"/>
</DataSet>
<DataSet Name="A2">
<Data DataElement="PAND" Value="B200"/>
<Data DataElement="MKDI" Value="900"/>
</DataSet>
</ApplicationData>
</ApplicationDataNotification>
如果使用位置表示法则可以使用(返回:A100):
with testTable(xml_val)
as (
select xmltype(
'
<ApplicationDataNotification>
<ApplicationData>
<DataSet Name="A1">
<Data DataElement="PAND" Value="A100"/>
<Data DataElement="MKDI" Value="007"/>
</DataSet>
<DataSet Name="A2">
<Data DataElement="PAND" Value="B200"/>
<Data DataElement="MKDI" Value="900"/>
</DataSet>
</ApplicationData>
</ApplicationDataNotification>
') from dual)
select xmlcast(xmlquery('/ApplicationDataNotification/ApplicationData/DataSet[1]/Data[1]/@Value' passing xml_val returning content) as varchar2(2000)) as PAN
from testTable;
但是问题是xml标记的顺序不固定。
因此,我尝试使用这种方法:
with testTable(xml_val)
as (
select xmltype(
'
<ApplicationDataNotification>
<ApplicationData>
<DataSet Name="A1">
<Data DataElement="PAND" Value="A100"/>
<Data DataElement="MKDI" Value="007"/>
</DataSet>
<DataSet Name="A2">
<Data DataElement="PAND" Value="B200"/>
<Data DataElement="MKDI" Value="900"/>
</DataSet>
</ApplicationData>
</ApplicationDataNotification>
') from dual)
select xmlcast(xmlquery('/ApplicationDataNotification/ApplicationData/DataSet[Name="A1"]/Data[DataElement="PAND"]/@Value' passing xml_val returning content) as varchar2(2000)) as PAN
from testTable;
它返回null。
对不起,但我感到困惑...请您能提供帮助! 如何重新编写查询以使工作正常? 附注:Oracle 12g
答案 0 :(得分:0)
对不起,很简单: 省略“ @” 选择xmlcast(xmlquery('/ ApplicationDataNotification / ApplicationData / DataSet [@ Name =“ A1”] / Data [@ DataElement =“ PAND”] / @ Value'通过xml_val返回内容)作为varchar2(2000)作为PAN 从testTable;
答案 1 :(得分:0)
使用FLWOR表达式可能是这样的:
with testTable(xml_val)
as (
select xmltype(
'
<ApplicationDataNotification>
<ApplicationData>
<DataSet Name="A1">
<Data DataElement="PAND" Value="A100"/>
<Data DataElement="MKDI" Value="007"/>
</DataSet>
<DataSet Name="A2">
<Data DataElement="PAND" Value="B200"/>
<Data DataElement="MKDI" Value="900"/>
</DataSet>
</ApplicationData>
</ApplicationDataNotification>
') from dual)
select xmlquery('for $i in /ApplicationDataNotification/ApplicationData/DataSet
let $j := $i/Data[@DataElement = "PAND"]
where $i/@Name eq "A1"
return $j/@Value'
passing xml_val returning content) colval
from testTable;