对于existsNode,如何将不同值作为XPath中text()的内容区分?

时间:2018-01-03 19:04:22

标签: sql xml database oracle xpath

我在Oracle数据库的一个XMLType列下提取存储在特定XPath下的所有可能值时遇到问题。

我尝试了existsNode,它只能返回我指定内容的XML(product_1),但是我需要查询返回指定XPath下我的表中出现的所有值。 我知道我需要使用select distinct,但不确定如何构建我的查询以使其工作。

目前我在这里:

select distinct (my_table) where 
existsNode(my_table,'/warehouse/shelf[productId="product_1"]','xmlns="xmnls_path"')
=1;

1 个答案:

答案 0 :(得分:0)

你可以试试这个:

select distinct extractvalue( value(tags), 'shelf/data/text()') 
from table( xmlsequence( xmltype( 
   '<warehouse>
        <shelf productId="product_1">
            <data>bla1-bla1</data>
        </shelf>
        <shelf productId="product_1">
            <data>bla2-bla2</data>
        </shelf>
        <shelf productId="product_1">
            <data>bla2-bla2</data>
        </shelf>
        <shelf productId="product_2">
            <data>bla3-bla3</data>
        </shelf>
   </warehouse>' 
   ).extract('warehouse/shelf[@productId="product_1"]'))) tags

或者如果您想要与所有行不同:

select distinct extractvalue( value(tags), 'shelf/data/text()') val 
from my_table, table( xmlsequence( 
    xmltype( my_table.xmlclobcolumn ).extract('warehouse/shelf[@productId="product_1"]')
)) tags