sql >> Database teknologi >  >> RDS >> Oracle

Hvordan kan jeg få CDATA-værdi fra xml

Udtræksfunktionen har været forældet i lang tid (i hvert fald siden 11gR2 - se noten i den dokumentation).

Hvis du har flere værdier og måske ønsker at se mere end én, kan du bruge XMLTable, som fjerner CDATA-støjen (men skal muligvis trimmes, da du har mellemrum i værdierne):

select x.stu_name, x.birthday,
  trim(stu_name) as stu_name2, to_char(x.birthday,'YYYY-MM-DD') as birthday2
from your_table t
cross join xmltable ('/RESPONSE/INFO' passing t.doc
  columns
    stu_name varchar2(30) path 'STU_NAME',
    birthday date path 'BIRTHDAY'
) x
where x.stu_name like '%M%'
STU_NAME BIRTHDAY  STU_NAME2 BIRTHDAY2
-------- --------- --------- ---------
 Maria   12-MAR-12 Maria     2012-03-12

Hvis du målretter mod en enkelt værdi, kan du også bruge xmlquery, som er tættere på dit udtræk:

select regexp_replace(
  xmlquery('/RESPONSE/INFO[contains(BIRTHDAY, "2012-03-12")]/STU_NAME/text()'
    passing doc
    returning content),
  '<!\[CDATA\[ *(.*?) *\]\]>', '\1') as stu_name
from your_table t
STU_NAME
--------
Maria

Her er jeg har ledt efter den fødselsdag, du ønskede som tekst i en node, og fik det matchende navn; men da det stadig har CDATA, er det nogenlunde det samme som du havde. Så jeg har brugt et regulært udtryk til at fjerne CDATA-delen, selvom du også kan bruge substr/instr, hvis ydeevne er et problem.

db<>fiddle




  1. Mysql fremmednøgle med ikke-entydig nøgle -- hvordan er det muligt?

  2. jQuery Validate Remote - Tjek, om e-mail allerede eksisterer

  3. MySQL rollback på MyISAM-motoren

  4. "Falal intern forbindelsesfejl" ved udførelse af en indbygget kompileret lagret procedure i SQL Server 2019 (kendt fejl)