2017-03-24 1 views
0

Oracle SQLでのXMLオブジェクトの問合せに関するエントリが多数あります。しかし、まだ、私は私の疑問に対して何の答えも見つけられませんでした。 私はいくつかの列を含むSQLテーブル( "obj")を持っています。 XML形式のclobオブジェクト(列は「定義」と呼ばれます)。 私はclobから具体的な値を抽出したいと思います。 XMLは次のようになります。Oracle SQLでのXMLオブジェクトの問合せ:オブジェクトの別の属性を指定して属性値を取得する

<?xml version="1.0" encoding="UTF-8"?> 
    <m> 
     <i n="Status">0</i> 
     <s n="Description">AmountDifference</s> 
     <s n="Name">InputvsOutput</s> 
     <a n="Variables"> 
      <m> 
       <s n="Name">Formula</s> 
       <s n="Value">B-A</s> 
      </m> 
      <m> 
       <s n="Name">CriticalDiff</s> 
       <s n="Value">abs({B} - {A}) &lt; 10</s> 
      </m> 
     </a> 
    </m> 

SQLクエリは、2つの値を返す必要があります。説明と値の名前= CriticalDiff。

CAST(
CASE WHEN obj.definition is not null then 
     UTL_I18N.UNESCAPE_REFERENCE(
       XMLTYPE(obj.definition). 
       EXTRACT('//s[@n="Description"]/text()') 
       .getStringVal()) 
END as varchar(200)) as "Rule Expression" 
, obj.definition as rule_xml 

私はその名前で値を取得するように、CAST-BLOKが正常に動作しているが、私は同様の方法で最後のコマンドを変換する方法を疑問に思う(=:SQLクエリの 一部は、このようになりますCriticalDiff)。

私が直面する難しさは、同じ属性名(名前、値)を持つ2つの同様の要素(m)があることです。

"CriticalDiff"から "値"属性を取得するにはどうすればよいですか?

ありがとうございます!

答えて

0

試してみてください。

WITH obj AS (
SELECT q'[<?xml version="1.0" encoding="UTF-8"?> 
    <m> 
     <i n="Status">0</i> 
     <s n="Description">AmountDifference</s> 
     <s n="Name">InputvsOutput</s> 
     <a n="Variables"> 
      <m> 
       <s n="Name">Formula</s> 
       <s n="Value">B-A</s> 
      </m> 
      <m> 
       <s n="Name">CriticalDiff</s> 
       <s n="Value">abs({B} - {A}) &lt; 10</s> 
      </m> 
     </a> 
    </m>]' as definition FROM dual 
) SELECT 
    XMLTYPE(obj.definition). 
    EXTRACT('//s[@n="Description"]/text()').getStringVal() as Description, 
    XMLTYPE(obj.definition). 
    EXTRACT('//m/s[@n="Name" and text() = "CriticalDiff"]/text()').getStringVal() as Name, 
    UTL_I18N.UNESCAPE_REFERENCE(XMLTYPE(obj.definition). 
    EXTRACT('//m/s[@n="Name" and text() = "CriticalDiff"]/../s[@n="Value"]/text()').getStringVal()) as Value 
FROM obj; 

DESCRIPTION  |NAME   |VALUE    | 
-----------------|-------------|--------------------| 
AmountDifference |CriticalDiff |abs({B} - {A}) < 10 | 

も作品のxpathの別のバージョン:

EXTRACT('//m[s[@n="Name" and text() = "CriticalDiff"]]/s[@n="Value"]/text()').getStringVal()) as Value 
関連する問題