SQL Oracle exctra c значение из XML неупорядоченной коллекции - PullRequest
1 голос
/ 06 мая 2020

У меня есть клоб с XML вот так:

<Data>  
 <Email_List>
      <Email>
         <EmailPrimaryFlag>Y</EmailPrimaryFlag>
         <EmailAddress>test@test.it</EmailAddress>
      </Email>
      <Email>
         <EmailPrimaryFlag>N</EmailPrimaryFlag>
         <EmailAddress>test2@test2.it</EmailAddress>
      </Email>
      <Email>
         <EmailPrimaryFlag>N</EmailPrimaryFlag>
         <EmailAddress>test3@test3.it</EmailAddress>
      </Email>
   </Email_List>
   <User>Name_User</User>
   <City>City_test</City>
</Data>

Мне нужно сделать извлечение только для PrimaryFlag = Y

Обычно я делаю что-то вроде этого:

select
extract(xmltype(PAYLOAD),'//*:User/text()').getStringVal() as User,
extract(xmltype(PAYLOAD),'//*:City/text()').getStringVal() as City,

, но я не знаю, как я могу извлечь для почты с помощью PrimaryFlag = Y

Особая благодарность

Michel

1 Ответ

1 голос
/ 06 мая 2020

Избегайте использования EXRACT (), так как он устарел.

with t (payload) as (
select to_clob('<Data>  
 <Email_List>
      <Email>
         <EmailPrimaryFlag>Y</EmailPrimaryFlag>
         <EmailAddress>test@test.it</EmailAddress>
      </Email>
      <Email>
         <EmailPrimaryFlag>N</EmailPrimaryFlag>
         <EmailAddress>test2@test2.it</EmailAddress>
      </Email>
      <Email>
         <EmailPrimaryFlag>N</EmailPrimaryFlag>
         <EmailAddress>test3@test3.it</EmailAddress>
      </Email>
   </Email_List>
   <User>Name_User</User>
   <City>City_test</City>
</Data>') from dual)
select x.* from t, xmltable(
'/Data'
passing xmltype(payload)
columns
 primary_email varchar2(60) path 'Email_List/Email/EmailAddress[../EmailPrimaryFlag = "Y"]',
 username varchar2(60)      path 'User',
 city varchar2(60)          path 'City'
)x;

PRIMARY_EMAIL                                                  USERNAME                                                       CITY                                                        
------------------------------------------------------------   ------------------------------------------------------------   ------------------------------------------------------------
test@test.it                                                   Name_User                                                      City_test                                                      
...