sql >> Database >  >> RDS >> Oracle

Hoe kan ik de CDATA-waarde van xml krijgen?

De extract-functie is lange tijd niet meer gebruikt (tenminste sinds 11gR2 - zie de opmerking in die documentatie).

Als je meerdere waarden hebt en er misschien meer dan één wilt zien, kun je XMLTable gebruiken, die de CDATA-ruis verwijdert (maar die misschien moet worden bijgesneden omdat je spaties in de waarden hebt):

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

Als u een enkele waarde target, kunt u ook xmlquery gebruiken, wat dichter bij uw extract ligt:

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 heb ik gezocht naar de verjaardag die je als tekst in een knooppunt wilde hebben en de bijbehorende naam kreeg; maar omdat die nog steeds de CDATA heeft, is het ongeveer hetzelfde als wat je had. Dus ik heb een reguliere expressie gebruikt om het CDATA-gedeelte te strippen, maar je kunt ook substr/instr gebruiken als prestaties een probleem zijn.

db<>fiddle




  1. MySQL NOW()-functie met hoge precisie

  2. Fout bij het maken van tabel:u heeft een fout in uw SQL-syntaxis in de buurt van 'order( order_id INT UNSIGNED NOT NULL AUTO_INCREMENT, user_id ' op regel 1

  3. MySQL UPDATE met willekeurig getal tussen 1-3

  4. Hoe MySQL Trigger-uitzondering / storingsinfo op te slaan in een tabel of in variabelen