簡體   English   中英

如何從 XMLTYPE 中提取第一個節點值?

[英]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

三人皆歸

db<>小提琴


如果您仍在使用 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;

它們不完全相同,但在這里不應該有所作為。

db<>小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM