sql >> データベース >  >> RDS >> Oracle

XMLからCDATA値を取得するにはどうすればよいですか?

    抽出機能は長い間非推奨になっています(少なくとも 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<>フィドル




    1. PHP/MySQLを使用した階層再帰メニュー

    2. php、pdomysqlは内部結合で挿入できません

    3. PostgreSQLで3つのテーブルを結合した後に行をカウントする

    4. トリガーはトランザクションですか?