在Oracle SQL中选择xpath值作为单独的行
我需要从存储在Oracle数据库的CLOB列中的XML中选择一些值。 我能想到的最好的是以下几点:
select extract(xmltype(COLUMN), 'xpath-expression').getStringVal() as XMLVAL from TABLE t;
问题是当XPATH选择多个节点时,这些值被连接在一起。 我需要将每个选定的节点放在单独的行上。 显然,串联必须发生在getStringVal()中,我使用它,因为我需要在我的客户端中有字符串(不是XMLType)。 我应该用什么来代替getStringVal()?
编辑:请注意,这里有一个类似的问题:Oracle Pl / SQL:通过XMLTYPE节点循环 - 但我无法将其应用于我的案例。 它使用两种不同的XPATH表达式,并且分离的原理不明确。
编辑2:XML是非常复杂的,但基本上我需要找到“一些价值”条目
<string name="SOME_KEY" value="some value"/>
在许多其他因素下被埋没的元素。 我使用XPATH //*[@name="SOME_KEY"]/@value
,它成功找到所有具有SOME_KEY属性的XML元素的值属性。
尝试这个。
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
我已经接近同样的事情,但与“吃桃子”的答案不太一样。 我在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;
希望这可以帮助别人:)
链接地址: http://www.djcxy.com/p/13695.html