我有一个xml,它在我的表的clob字段中
这是我目前使用的代码:
create table
xml_key
(
mycol number,
xml clob
);
insert into xml_key
values(1653,
'<AppHdr>
<Fr>
<FIId>
<FinInstnId>
<BICFI>CRESUS33</BICFI>
</FinInstnId>
</FIId>
</Fr>
<To>
<FIId>
<FinInstnId>
<BICFI>CAYTTRISXXX</BICFI>
</FinInstnId>
</FIId>
</To>
<BizMsgIdr>e9aab4a5-bc32-4548-93f6-aa47dd97d77</BizMsgIdr>
<MsgDefIdr>pac.004.001.09</MsgDefIdr>
<BizSvc>swift.cbprplus.02</BizSvc>
<CreDt>2019-08-12T13:59:26+01:00</CreDt>
<Rltd>
<Fr>
<FIId>
<FinInstnId>
<BICFI>LOYDGB21002</BICFI>
</FinInstnId>
</FIId>
</Fr>
<To>
<FIId>
<FinInstnId>
<BICFI>CRESUS33</BICFI>
</FinInstnId>
</FIId>
</To>
<BizMsgIdr>1234567890</BizMsgIdr>
<MsgDefIdr>pacs.008.001.08</MsgDefIdr>
<CreDt>2019-08-12T12:59:26+01:00</CreDt>
</Rltd>
</AppHdr>');
当我从xml中提取BIC代码时,我遇到了一个问题。我不想要像CRESUS33LOYDGB21002这样的双节点如何从xml中仅提取CRESUS33作为FromBIC?
select XMLTYPE(t.xml).EXTRACT('//Fr/FIId/FinInstnId/BICFI/text()').getStringVal() fromBIC,
XMLTYPE(t.xml).EXTRACT('//Rltd/Fr/FIId/FinInstnId/BICFI/text()').getStringVal() RltdFromBIC
from xml_key t
where mycol=1653 ;
FROMBIC RLTDFROMBIC
--------------------------------- --------------------------------------
CRESUS33LOYDGB21002 LOYDGB21002
谢谢
问题是,在两个提取调用中都使用//Fr
作为快捷方式,而由于Fr
是直接位于AppHdr
和AppHdr/Rltd
下的节点,因此第一个XPath与这两个节点匹配,最终将两者的值组合在一起。第二个Xpath更具选择性,因此只能看到第二个。
如果你给出两者的完整路径,那么你就不会有这个问题:
select XMLTYPE(t.xml).EXTRACT('/AppHdr/Fr/FIId/FinInstnId/BICFI/text()').getStringVal() fromBIC,
XMLTYPE(t.xml).EXTRACT('/AppHdr/Rltd/Fr/FIId/FinInstnId/BICFI/text()').getStringVal() RltdFromBIC
from xml_key t
where mycol=1653 ;
您还可以使用XMLQuery:
select
XMLQuery('/AppHdr/Fr/FIId/FinInstnId/BICFI/text()'
passing XMLTYPE(t.xml)
returning content).getStringVal() as fromBIC,
XMLQuery('/AppHdr/Rltd/Fr/FIId/FinInstnId/BICFI/text()'
passing XMLTYPE(t.xml)
returning content).getStringVal() as RltdFromBIC
from xml_key t
where mycol=1653;
或XMLTable:
select x.fromBIC, x.RltdFromBIC
from xml_key t
cross apply XMLTable(
'/AppHdr'
passing XMLTYPE(t.xml)
columns
fromBIC path 'Fr/FIId/FinInstnId/BICFI',
RltdFromBIC path 'Rltd/Fr/FIId/FinInstnId/BICFI'
) x
where mycol=1653;
FROMBIC | RLTDFROMBIC |
---|---|
CRESUS33 | >LOYDGB21002