2016-10-24 58 views
0

我有這樣的XML:XML父在SQL查詢,XPath的

< person code="SNIPER"> 

    <type code="SINGLE" /> 

<version code="1" dateFrom="2015-03-20" /> 
</version> 

<version code="2" dateFrom="2012-06-15" /> 
</version> 

< /person> 

我有SQL查詢:

select extract(VALUE(cd_xml), 'version/@code').getstringval() code 
     ,cast(to_timestamp_tz(replace(extract(VALUE(cd_xml), 'version/@dateFrom') 
                .getstringval(), 'T', ''), 
              'yyyy-mm-dd') as date) datefrom 

from table(xmlsequence(extract(get_xml, '/*/person/version'))) cd_xml 

它返回我的兩行:

1 2015-03-10 

2 2012-06-15 

我想作爲結果獲得這樣的行:

single 1 2015-03-10 

single 2 2012-06-15 

sniper 1 2015-03-10 

sniper 2 2012-06-15 

如何做到這一點? 我試圖與父母條款不同thigs,但我還沒有使它:(

+0

你如何決定是否要「單」或「狙擊」?此外,您的XML具有'版本'節點,它們都是自動關閉的並帶有明確的關閉標記,這使得它無效;你的XPath需要一個*以上的*節點*。你可以編輯問題以保持一致嗎? –

+0

我簡化了一個問題。我得到了xml這樣的xml少數。事情是我需要「單」行。但萬一我以某種方式接收狙擊手的行我可以做另一個查詢連接「狙擊手」與「單」 – MPAW

回答

0

The extract function is deprecated;你可以使用它的這一點,但它更好地使用XMLQuery/XMLTable,例如,假設get_xml是返回您的正確格式的XML作爲一個功能一個XMLType:

select * 
from xmltable('/persons/person/version' 
    passing get_xml 
    columns person_code varchar2(10) path './../@code', 
    type_code varchar2(10) path './../type/@code', 
    version_code number path '@code', 
    version_datefrom date path '@dateFrom' 
); 

演示靜態XML,從你貼什麼來匹配你所用的模式修改:

select * 
from xmltable('/persons/person/version' 
    passing xmltype('<persons> 
    <person code="SNIPER"> 
    <type code="SINGLE" /> 
    <version code="1" dateFrom="2015-03-20" /> 
    <version code="2" dateFrom="2012-06-15" /> 
    </person> 
</persons>') 
    columns person_code varchar2(10) path './../@code', 
    type_code varchar2(10) path './../type/@code', 
    version_code number path '@code', 
    version_datefrom date path '@dateFrom' 
); 

PERSON_COD TYPE_CODE VERSION_CODE VERSION_DA 
---------- ---------- ------------ ---------- 
SNIPER  SINGLE    1 2015-03-20 
SNIPER  SINGLE    2 2012-06-15 

您的操作建議dateFrom確實是一個完整的時間戳,更像是'2015-03-20T12:34:56+04:00';如果你只是想的是日期部分,你可以得到更多的簡直太,爲timestamp with time zone提取列,然後澆注在最後:

select person_code, type_code, version_code, 
    cast(version_datefrom as date) as version_datefrom 
from xmltable('/persons/person/version' 
    passing xmltype('<persons> 
    <person code="SNIPER"> 
    <type code="SINGLE" /> 
    <version code="1" dateFrom="2015-03-20T12:34:56+04:00" /> 
    <version code="2" dateFrom="2012-06-15T23:00:00+00:00" /> 
    </person> 
</persons>') 
    columns person_code varchar2(10) path './../@code', 
    type_code varchar2(10) path './../type/@code', 
    version_code number path '@code', 
    version_datefrom timestamp with time zone path '@dateFrom' 
);