在Oracle SQL中将xpath值选择为单独的行

时间:2013-05-24 13:15:49

标签: sql xml oracle xpath xmltype

我需要从存储在Oracle数据库的CLOB列中的XML中选择一些值。 我能想到的最好的是:

select extract(xmltype(COLUMN), 'xpath-expression').getStringVal() as XMLVAL from TABLE t;

问题是当XPATH选择多个节点时,会连接这些值。我需要将每个选定的节点放在一个单独的行上。显然连接必须出现在getStringVal()中,我使用它,因为我需要在我的客户端(而不是XMLType)中有字符串。我应该使用什么而不是getStringVal()?

编辑:请注意这里有一个类似的问题:Oracle Pl/SQL: Loop through XMLTYPE nodes - 但我不能将它应用于我的案例。它使用两种不同的XPATH表达式,分离原则尚不清楚。

EDIT2:XML非常复杂,但基本上我需要在

中找到“一些值”条目
<string name="SOME_KEY" value="some value"/>

在许多其他元素下埋葬的元素。我使用XPATH //*[@name="SOME_KEY"]/@value,它成功找到具有SOME_KEY属性的所有XML元素的value属性。

2 个答案:

答案 0 :(得分:4)

试试这个。

SELECT EXTRACTVALUE (x.COLUMN_VALUE, 'xpath-expression')
  FROM TABLE (
          SELECT XMLSEQUENCE (
                    xmltype (column).EXTRACT ('xpath-expression'))
            FROM t) x;

http://sqlfiddle.com/#!4/87af2/1

的示例

答案 1 :(得分:2)

我接近同样的事情,但它与“吃一个桃子”的答案并不相符。我在列中的内容类似xmltype。

<?xml version="1.0" encoding="UTF-8"?>
<serviceRequestAnswer xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:ns2="http://www.something.something/bla/v1">
  <Persons>
    <Person>
      <InternalIdNumber>2935612467</InternalIdNumber>
      <PublicIdNumber>9871256327</PublicIdNumber>
      <FirstNames>Remy</FirstNames>
      <LastName>Smith</LastName>
      <BirthName>Smith</BirthName>
      <BirthDate>19900101</BirthDate>
      <PlaceOfBirth>0209</PlaceOfBirth>
      <CountryOfBirth>6030</CountryOfBirth>
      <Sex>M</Sex>
      <Nationality>0001</Nationality>
    </Person>
    <Person>
      <InternalIdNumber>7163584061</InternalIdNumber>
      <PublicIdNumber>123432678</PublicIdNumber>
      <FirstNames>Jesse</FirstNames>
      <LastName>Smith</LastName>
      <BirthName>Smith</BirthName>
      <BirthDate>19900101</BirthDate>
      <PlaceOfBirth>0012</PlaceOfBirth>
      <CountryOfBirth>6030</CountryOfBirth>
      <Sex>M</Sex>
      <Nationality>0001</Nationality>
    </Person>
  </Persons>
</serviceRequestAnswer>

让我们调用列xmlcontent,并将其放在名为mytable的表中。然后将2个公共ID号提取为2行可以这样做:

select  
nvl(value (line).extract ('/Person/PublicIdNumber/text()').getstringval (),'') PublicId
from mytable, table ( xmlsequence (extract(xmlcontent,'serviceRequestAnswer/Persons/Person'))) line 
where id_mytable = 10092053;

希望这有助于某人:)