2017-03-24 9 views
0

Oracle SQL에서 XML 객체를 쿼리하는 것과 관련하여 많은 항목이 있습니다. 그러나 여전히, 나는 나의 의지에 대한 어떤 대답도 찾을 수 없었다. 일부 열을 포함하는 sql-table ("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 쿼리는 두 개의 값을 반환해야합니다 : 설명과 값 이름 = CriticalDiff. = 캐스트-BLOK가 잘 작동

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 

,하지만 난 (그 이름 값을 얻을 수 있도록 유사한 방식으로 마지막 명령을 변환하는 방법을 궁금해 : SQL 쿼리의 부분은 다음과 같습니다 CriticalDiff).

내가 직면 한 어려움은 동일한 속성 이름 (이름, 값)을 가진 두 개의 유사한 요소 (m)가 있다는 것입니다.

"CriticalDiff"에서 "가치"- 속성을 얻을 수있는 아이디어가 있습니까?

미리 감사드립니다.

답변

0

시도 :

EXTRACT('//m[s[@n="Name" and text() = "CriticalDiff"]]/s[@n="Value"]/text()').getStringVal()) as Value 
을 :

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는 또 다른 버전