Oracle
 sql >> база данни >  >> RDS >> Oracle

Как мога да получа стойност на CDATA от xml

Функцията за извличане е отхвърлена от дълго време (поне от 11gR2 - вижте бележката в тази документация).

Ако имате няколко стойности и може да искате да видите повече от една, можете да използвате XMLTable, който премахва CDATA шума (но може да се нуждае от подрязване, тъй като имате интервали в стойностите):

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

Ако се насочвате към една стойност, можете също да използвате xmlquery, което е по-близо до вашия екстракт:

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

Ето, потърсих рождения ден, който искахте като текст в рамките на възел, и получих съответстващото име; но тъй като все още има CDATA, той е приблизително същият като това, което сте имали. И така, използвах регулярен израз, за ​​да премахна CDATA частта, въпреки че можете също да използвате substr/instr, ако производителността е проблем.

db<>fiddle




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. цифрово препълване с NULL колона (0,3)

  2. Как мога да получа разликата в часовете между две дати?

  3. Как да получите файл от BLOB в Oracle?

  4. .NET Core 2 + System.Data.OracleClient. Китайските йероглифи не работят

  5. Изчисляване на средната цена на инвентара в SQL