Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie kann ich den CDATA-Wert aus XML erhalten

Die Extraktionsfunktion ist seit langem veraltet (mindestens seit 11gR2 - siehe Hinweis in dieser Dokumentation).

Wenn Sie mehrere Werte haben und mehr als einen sehen möchten, können Sie XMLTable verwenden, das das CDATA-Rauschen entfernt (aber möglicherweise eine Kürzung erforderlich ist, da Sie Leerzeichen in den Werten haben):

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

Wenn Sie auf einen einzelnen Wert abzielen, können Sie auch xmlquery verwenden, das näher an Ihrem Extrakt liegt:

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

Hier habe ich nach dem Geburtstag gesucht, den Sie als Text in einem Knoten haben wollten, und den passenden Namen erhalten. aber da das immer noch die CDATA hat, ist es ungefähr das gleiche wie das, was Sie hatten. Also habe ich einen regulären Ausdruck verwendet, um den CDATA-Teil zu entfernen, obwohl Sie auch substr/instr verwenden könnten, wenn es um die Leistung geht.

db<>fiddle