sql >> Databasteknik >  >> RDS >> Oracle

Hur kan jag få CDATA-värde från xml

Extraheringsfunktionen har föråldrats under lång tid (åtminstone sedan 11gR2 - se anteckningen i den dokumentationen).

Om du har flera värden och kanske vill se mer än ett kan du använda XMLTable, som tar bort CDATA-bruset (men kan behöva trimmas eftersom du har mellanslag i värdena):

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

Om du riktar in dig på ett enskilt värde kan du också använda xmlquery, som är närmare ditt extrakt:

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

Här är jag har letat efter födelsedagen du ville ha som text i en nod, och fick det matchande namnet; men eftersom det fortfarande har CDATA så är det ungefär detsamma som du hade. Så jag har använt ett reguljärt uttryck för att ta bort CDATA-delen, men du kan också använda substr/instr om prestanda är ett problem.

db<>fiol




  1. Hur man återställer ett offentligt schema till ett annat schema

  2. MySQL - Hur man väljer data efter stränglängd

  3. Inga data hittades eller för många rader undantagsfel inträffade under masspostinsättning

  4. Skillnad mellan flytande och decimal datatyp