[英]How can I extract the first node value from a XMLTYPE?
我有一個 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;
或 XML 表:
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;
弗羅比奇 | RLTDFROMBIC |
---|---|
CRESUS33 | LOYDGB21002 |
三人皆歸
如果您仍在使用 12c 之前的版本,則可以使用cross join
而不是cross apply
:
select x.fromBIC, x.RltdFromBIC
from xml_key t
cross join XMLTable(
'/AppHdr'
passing XMLTYPE(t.xml)
columns
fromBIC path 'Fr/FIId/FinInstnId/BICFI',
RltdFromBIC path 'Rltd/Fr/FIId/FinInstnId/BICFI'
) x
where mycol=1653;
它們不完全相同,但在這里不應該有所作為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.