Как выбрать значение из поля XML в запросе Oracle - PullRequest
0 голосов
/ 14 мая 2019

У меня есть данные XML из одного из моих столбцов таблицы, для которых примерный формат xml указан ниже:

<?xml version="1.0" encoding="Big5"?>
<SN Name="Group Medical Member Setup">
  <DO Name="datPrlMmr" Label="" Table="COMPRLMMR">
    <RECORD>
      <ACTION Name="M">
    <F Name="MMRCNYOFRSN" Label="" OldValue="HKG" NewValue="AUS" />
    <F Name="MDFBY" Label=" " OldValue="fc" NewValue="admin" />
    <F Name="MDFTMSTP" Label=" " OldValue="Thu Feb 19 11:14:37 HKT 2004" NewValue="Tue May 07 14:24:09 HKT 2019" />
      </ACTION>
    </RECORD>
  </DO>
  <DO Name="doAdmGMPlyMmrDtl" Label="" Table="ADMGMPLYMMRDTL">
    <RECORD>
      <ACTION Name="M">
    <F Name="MDFTMSTP" Label="Modified TimeStamp" OldValue="Mon May 06 03:12:20 SGT 2019" NewValue="Mon May 06 03:15:00 SGT 2019" />
    <F Name="RCDTMSTP" Label="Record TimeStamp" OldValue="Mon May 06 03:12:20 SGT 2019" NewValue="Mon May 06 03:15:00 SGT 2019" />
      </ACTION>
    </RECORD>
  </DO>
</SN>

Я хочу извлечь значение, соответствующее тегу ' NewValue ' для поля Name = "MMRCNYOFRSN" . Это появится только один раз в XML. Пожалуйста, помогите мне с соответствующим способом извлечь NewValue (AUS) через SQL Query for oracle.

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Поскольку вам нужно только одно (атрибутное) значение, вы также можете сделать это с помощью XMLQuery :

-- CTE for your sample data
with your_table (your_column) as (
  select xmltype('<?xml version="1.0" encoding="Big5"?>
<SN Name="Group Medical Member Setup">
  <DO Name="datPrlMmr" Label="" Table="COMPRLMMR">
    <RECORD>
      <ACTION Name="M">
    <F Name="MMRCNYOFRSN" Label="" OldValue="HKG" NewValue="AUS" />
    <F Name="MDFBY" Label=" " OldValue="fc" NewValue="admin" />
    <F Name="MDFTMSTP" Label=" " OldValue="Thu Feb 19 11:14:37 HKT 2004" NewValue="Tue May 07 14:24:09 HKT 2019" />
      </ACTION>
    </RECORD>
  </DO>
  <DO Name="doAdmGMPlyMmrDtl" Label="" Table="ADMGMPLYMMRDTL">
    <RECORD>
      <ACTION Name="M">
    <F Name="MDFTMSTP" Label="Modified TimeStamp" OldValue="Mon May 06 03:12:20 SGT 2019" NewValue="Mon May 06 03:15:00 SGT 2019" />
    <F Name="RCDTMSTP" Label="Record TimeStamp" OldValue="Mon May 06 03:12:20 SGT 2019" NewValue="Mon May 06 03:15:00 SGT 2019" />
      </ACTION>
    </RECORD>
  </DO>
</SN>')
  from dual
)
-- actual query
select xmlquery('/SN/DO/RECORD/ACTION/F[@Name="MMRCNYOFRSN"]/@NewValue'
  passing t.your_column
  returning content) as MMRCNYOFRSN
from your_table t;

MMRCNYOFRSN                                                                     
--------------------------------------------------------------------------------
AUS
0 голосов
/ 14 мая 2019
with s as 
(select xmltype('<?xml version="1.0" encoding="Big5"?>
<SN Name="Group Medical Member Setup">
  <DO Name="datPrlMmr" Label="" Table="COMPRLMMR">
    <RECORD>
      <ACTION Name="M">
    <F Name="MMRCNYOFRSN" Label="" OldValue="HKG" NewValue="AUS" />
    <F Name="MDFBY" Label=" " OldValue="fc" NewValue="admin" />
    <F Name="MDFTMSTP" Label=" " OldValue="Thu Feb 19 11:14:37 HKT 2004" NewValue="Tue May 07 14:24:09 HKT 2019" />
      </ACTION>
    </RECORD>
  </DO>
  <DO Name="doAdmGMPlyMmrDtl" Label="" Table="ADMGMPLYMMRDTL">
    <RECORD>
      <ACTION Name="M">
    <F Name="MDFTMSTP" Label="Modified TimeStamp" OldValue="Mon May 06 03:12:20 SGT 2019" NewValue="Mon May 06 03:15:00 SGT 2019" />
    <F Name="RCDTMSTP" Label="Record TimeStamp" OldValue="Mon May 06 03:12:20 SGT 2019" NewValue="Mon May 06 03:15:00 SGT 2019" />
      </ACTION>
    </RECORD>
  </DO>
</SN>') x from dual)
select t.*
from s,
xmltable(
'/SN/DO/RECORD/ACTION/F[@Name="MMRCNYOFRSN"]'
passing s.x
columns
name     varchar2(100) path '@Name',
oldvalue varchar2(100) path '@OldValue',
newvalue varchar2(100) path '@NewValue'
)(+) t;

NAME            OLDVALUE        NEWVALUE       
--------------- --------------- ---------------
MMRCNYOFRSN     HKG             AUS 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...