sql >> Databáze >  >> RDS >> Oracle

Jak mohu získat hodnotu CDATA z xml

Funkce extraktu byla na dlouhou dobu zastaralá (přinejmenším od 11gR2 - viz poznámka v této dokumentaci).

Pokud máte více hodnot a možná budete chtít vidět více než jednu, můžete použít XMLTable, která odstraňuje šum CDATA (ale možná bude potřeba oříznout, protože v hodnotách máte mezery):

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

Pokud cílíte na jednu hodnotu, můžete také použít xmlquery, který je bližší vašemu výpisu:

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

Tady jsem hledal narozeniny, které jste chtěli jako text v uzlu, a dostal jsem odpovídající jméno; ale protože to stále má CDATA, je to zhruba stejné jako to, co jste měli. Použil jsem tedy regulární výraz k odstranění části CDATA, i když můžete také použít substr/instr, pokud jde o výkon.

db<>fiddle




  1. Vypořádání se s nespolehlivými sítěmi při vytváření řešení HA pro MySQL nebo MariaDB

  2. Chyba Oracle vytváří duplicitní agregované hodnoty v JSON_ARRAYAGG

  3. PHP a mysql se nevkládají

  4. Jak samostatně spojit tabulku tak, aby se každý záznam spojil s předchozím záznamem?