如何在ORACLE SQL中从XML中选择值?
我们假设我在表格中有两个XML" item":
第一行和第二列" intreevalue"数据
<change xmlns="http://do.it.com/ch/PLP">
<header>
<op>XDD</op>
</header>
<id>10565</id>
</change>
和 第二行和第二列&#34; intreevalue&#34;数据
<deactivate xmlns="http://mrlo.com/nnu/XCBouIK">
<header>
<op>XDG</id>
</header>
<id>67544</id>
</deactivate>
我知道&#34; EXTRACTVALUE&#34;被诽谤。我需要价值观&#34; op&#34;和&#34; id&#34;在一个选择。我想如果没有名称空间,例如&#39; xmlns =&#34; http://do.it.com/ch/PLP"&#39;这很容易。但我可以选择这样的数据(例如 - 我知道它可以工作,只是想说出我的意思)?
select "/*/header/op" op, "/*/id" id from .....
由于
答案 0 :(得分:1)
我看到两个选项:
使用REGEXP_REPLACE()
删除所有代码中的所有xmlns
属性。
SELECT EXTRACT(XMLTYPE(REGEXP_REPLACE(items.intreevalue,
'(<[^>]+[[:space:]]+)xmlns(?::[^[:space:]=]+)?[:space:]*=[:space:]*"[^"]*"',
'\1')),
'/*/header/op/text()')
.GETSTRINGVAL() op,
EXTRACT(XMLTYPE(REGEXP_REPLACE(items.intreevalue,
'(<[^>]+[[:space:]]+)xmlns(?::[^[:space:]=]+)?[:space:]*=[:space:]*"[^"]*"',
'\1')),
'/*/id/text()')
.GETNUMBERVAL() id
FROM items;
但如果您确实需要以不同方式处理来自不同名称空间的某些元素,则可能会出现问题。也许你可以调整正则表达式,只删除&#34;有问题的&#34;命名空间属性但保留其他属性。
使用较大的CASE ... END
检查每个可能的命名空间,并获取第一个(不是NULL
)结果。
SELECT CASE
WHEN EXTRACT(items.intreevalue,
'/*/header/op/text()',
'xmlns="http://do.it.com/ch/PLP"')
.GETSTRINGVAL() IS NOT NULL
THEN EXTRACT(items.intreevalue,
'/*/header/op/text()',
'xmlns="http://do.it.com/ch/PLP"')
.GETSTRINGVAL()
WHEN EXTRACT(items.intreevalue,
'/*/header/op/text()',
'xmlns="http://mrlo.com/nnu/XCBouIK"')
.GETSTRINGVAL() IS NOT NULL
THEN EXTRACT(items.intreevalue,
'/*/header/op/text()',
'xmlns="http://mrlo.com/nnu/XCBouIK"')
.GETSTRINGVAL()
END op,
CASE
WHEN EXTRACT(items.intreevalue,
'/*/id/text()',
'xmlns="http://do.it.com/ch/PLP"')
.GETNUMBERVAL() IS NOT NULL
THEN EXTRACT(items.intreevalue,
'/*/id/text()',
'xmlns="http://do.it.com/ch/PLP"')
.GETNUMBERVAL()
WHEN EXTRACT(items.intreevalue,
'/*/id/text()',
'xmlns="http://mrlo.com/nnu/XCBouIK"')
.GETNUMBERVAL() IS NOT NULL
THEN EXTRACT(items.intreevalue,
'/*/id/text()',
'xmlns="http://mrlo.com/nnu/XCBouIK"')
.GETNUMBERVAL()
END id
FROM items;
如果案例中没有包含名称空间,您仍然可以获得相应XML的NULL
个。