2017-10-26 3 views
0

Oracle内のXMLの特定の要素から最初のノードを抽出する際に問題があります。Oracle XMLTYPE最初のノードを抽出します

これはXMLです:

<data type="TestData" version="1"> 
    <MasterTable Name="TestMaster"/> 
    <Table Name="TestTable1">Test</Table> 
    <Table Name="TestTable2"/> 
    <Table Name="TestTable3"/> 
    <Table Name="TestTable4"/> 
    <Table Name="TestTable5"/> 
    <Table Name="TestTable6"/> 
    <Table Name="TestTable7"/> 
    <Table Name="TestTable8"/> 
    <Table Name="TestTable9"/> 
    <Table Name="TestTable10"/> 
    <Table Name="TestTable11"/> 
    <Table Name="TestTable12"/> 
    <Table Name="TestTable13"/> 
    <Table Name="TestTable14"/> 
    <Fact Name="TestFact1"/> 
</data> 

私が最初に名前要素「TestTable1」と最初Name要素「テスト」のためのテキストの値を抽出しようとしています。

私はヌルを返している次のクエリがあります:最初の 'テーブル'

select a.xml.extract('//Name[1]') from my_table a; --Attempting to return "TestTable1" from Name attribute 1 



select a.xml.extract('//Name[1]/text()') from my_table a; --Attempting to return the text "Test" from Name attribute 1 

答えて

0
with test as(select xmltype('<data type="TestData" version="1"> 
    <MasterTable Name="TestMaster"/> 
    <Table OtherName="TestTable1">OtherTable</Table> 
    <Table Name="TestTable1">Test</Table> 
    <Table Name="TestTable2"/> 
    <Table Name="TestTable3"/> 
    <Table Name="TestTable4"/> 
    <Table Name="TestTable5"/> 
    <Table Name="TestTable6"/> 
    <Table Name="TestTable7"/> 
    <Table Name="TestTable8"/> 
    <Table Name="TestTable9"/> 
    <Table Name="TestTable10"/> 
    <Table Name="TestTable11"/> 
    <Table Name="TestTable12"/> 
    <Table Name="TestTable13"/> 
    <Table Name="TestTable14"/> 
    <Fact Name="TestFact1"/> 
</data>') x from dual) 


select t.x.extract('//Table[@Name][1]'),t.x.extract('//Table[1]'), t.x.extract('//Table[@Name][1]/text()'),t.x.extract('//Table[1]/text()'),t.x.extract('//Table[./text()][1]') from test t; 

t.x.extract('//Table[@Name][1]')リターンを。属性名が の場合t.x.extract('//Table[1]')が最初に 'テーブル'を返します。
t.x.extract('//Table[./text()][1]')最初の空でないテーブル要素を返します。

+0

ありがとう!私がしたいことに向かって。 t.x.extract( '// Table [@Name] [1]')は要素全体を返します。

Test
、私は実際にはTestTable1のみを返したいと思っていました。それをする方法はありますか? [1]/NAME' –

+0

'は、すべてが正しく働いて、どうもありがとうございました –

+0

@ [@Name]属性 '//表の値にアクセスするためのAttribute_name' @ –

0

あなたはXMLTABLEを使用することができます。

SQL Fiddle

Oracleの11グラムR2スキーマのセットアップ

CREATE TABLE table_name (xml) as 
select xmltype('<data type="TestData" version="1"> 
    <MasterTable Name="TestMaster"/> 
    <Table OtherName="TestTable1">OtherTable</Table> 
    <Table Name="TestTable1">Test</Table> 
    <Table Name="TestTable2"/> 
    <Table Name="TestTable3"/> 
    <Table Name="TestTable4"/> 
    <Table Name="TestTable5"/> 
    <Table Name="TestTable6"/> 
    <Table Name="TestTable7"/> 
    <Table Name="TestTable8"/> 
    <Table Name="TestTable9"/> 
    <Table Name="TestTable10"/> 
    <Table Name="TestTable11"/> 
    <Table Name="TestTable12"/> 
    <Table Name="TestTable13"/> 
    <Table Name="TestTable14"/> 
    <Fact Name="TestFact1"/> 
</data>') from dual; 

クエリ1

SELECT x.* 
FROM table_name t 
     CROSS JOIN 
     XMLTABLE(
     '/data/Table[@Name][1]' 
     PASSING t.xml 
     COLUMNS Name VARCHAR2(20) PATH '@Name' 
     ) x 

Results:応答のための

|  NAME | 
|------------| 
| TestTable1 | 
関連する問題