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

Oracle XPath式の親要素の名前を取得するにはどうすればよいですか?

    Extractを使用すると、パスをより高く調べることができますが、(MOSドキュメント301709.1に記載されています。これは、9i用ですが、表示されるエラーを除けば、まだ有効と思われます):

    したがって、name()を使用することはできません 、local-name() などの機能、現在のノードまたは親ノード。そのドキュメントにはある種の回避策があり、例から少し簡略化して次のようにすることができます。

    EXTRACT(xmltype(d.data), '//ns1:myId/..', 
      'xmlns:ns1="http://acme.com/').getRootElement() xml2
    

    または少し異なる形式で:

    xmltype(d.data).extract('//ns1:myId/..', 
      'xmlns:ns1="http://acme.com/').getRootElement()
    

    両方のデモ:

    with data (pid, name, data) as (
      select 42, 'Test', '<?xml version="1.0" encoding="ISO-8859-1"?>
      <ns1:root xmlns:ns1="http://acme.com/"><ns1:parent><ns1:myId>1234</ns1:myId></ns1:parent></ns1:root>' from dual
    )
    select d.pid, d.name
    , EXTRACT(xmltype(d.data), '//ns1:myId', 'xmlns:ns1="http://acme.com/') xml
    , EXTRACT(xmltype(d.data), '//ns1:myId/..', 'xmlns:ns1="http://acme.com/').getRootElement() xml2
    , xmltype(d.data).extract('//ns1:myId/..', 'xmlns:ns1="http://acme.com/').getRootElement() xml3
    from DATA d
    order by d.pid desc
    ;
    
           PID NAME XML                            XML2       XML3     
    ---------- ---- ------------------------------ ---------- ----------
            42 Test <ns1:myId xmlns:ns1="http://ac parent     parent    
                    me.com/">1234</ns1:myId>                      
    

    ただし、 extract() とにかく非推奨です 。これは、XMLTable を使用して行うことができます。 :

    with data (pid, name, data) as (
      select 42, 'Test', '<?xml version="1.0" encoding="ISO-8859-1"?>
      <ns1:root xmlns:ns1="http://acme.com/"><parent><myId>1234</myId></parent></ns1:root>' from dual
    )
    select d.pid, d.name, x.*
    from data d
    cross join xmltable(xmlnamespaces('http://acme.com/' as "ns1"),
      '/ns1:*//myId'
      passing xmltype(d.data)
      columns myId number path '.',
        parent varchar2(20) path './../local-name()'
    ) x
    order by d.pid desc;
    
           PID NAME       MYID PARENT             
    ---------- ---- ---------- --------------------
            42 Test       1234 parent              
    

    より複雑なものが必要な場合は、ノードレベルから必要なものをすべて引き出すことができます。この回答に示されているように;しかし、あなたが言ったことから、それはここではやり過ぎです。




    1. MySQLで優先度を使用して複数の列を検索するにはどうすればよいですか?

    2. Laravel Eloquent LEFT JOIN WHERE NULL

    3. mysqlテーブルの一意の電子メールアドレスに基づく一意のコード?

    4. MySQLdbを使用してPythonで.sqlファイルを実行します