gpt4 book ai didi

sql - 在部分xpath上的Oracle 10.2.0.4.0查询

转载 作者:行者123 更新时间:2023-12-03 17:26:31 25 4
gpt4 key购买 nike

我需要更改以下查询,以便能够查询任何种类的投标项目。

/购物篮/ CardTenderItem /说明

/购物篮/ CashTenderItem /说明

所以

/购物篮/ WildcardTenderItem /说明

我已经看过各种示例,但是在运行时它们无法恢复任何结果(如果可以使用,请接受用户错误!)

SELECT 
RETURN_ID
,SALE_ID,
,extractValue(xmltype(RETURNxml),'/Basket/CashTenderItem/NetValue')
,extractValue(xmltype(RETURNxml),'/Basket/CashTenderItem/Description')
FROM SPR361
WHERE return_id = '9999.0303|20170327224954|2063'

最佳答案

如果您只想将TenderItem的任何内容都匹配,但之后再没有任何内容,则可以使用子字符串检查来进行具体说明:

SELECT 
RETURN_ID
,SALE_ID
,extractValue(xmltype(RETURNxml),
'/Basket/*[substring(name(), string-length(name()) - 9) = "TenderItem"]/NetValue')
,extractValue(xmltype(RETURNxml),
'/Basket/*[substring(name(), string-length(name()) - 9) = "TenderItem"]/Description')
FROM SPR361
WHERE return_id = '9999.0303|20170327224954|2063'


如果在该固定字符串之后再也没有节点,那么@Shnugo的 contains方法会更容易,并且在Oracle中将非常相似:

...
,extractValue(xmltype(RETURNxml),
'/Basket/*[contains(name(), "TenderItem")]/NetValue')
,extractValue(xmltype(RETURNxml),
'/Basket/*[contains(name(), "TenderItem")]/Description')


我不确定 name()local-name()在这里是否有真正的区别。

如果一个篮子可以有多个子节点(卡和现金,或每个以上),则还可以切换到XMLTable语法:

SELECT 
s.RETURN_ID
,s.SALE_ID
,x.netvalue
,x.description
FROM SPR361 s
CROSS JOIN XMLTable(
'/Basket/*[contains(name(), "TenderItem")]'
PASSING XMLType(s.RETURNxml)
COLUMNS netvalue NUMBER PATH './NetValue'
, description VARCHAR(80) PATh './Description'
) x
WHERE s.return_id = '9999.0303|20170327224954|2063'


也许这有点过分,但是对于更复杂的测试,您可以使用其他XPath语法,例如:

CROSS JOIN XMLTable(
'for $i in /Basket/*
where contains($i/name(), "TenderItem") return $i'
PASSING XMLType(s.RETURNxml)
...

关于sql - 在部分xpath上的Oracle 10.2.0.4.0查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43184507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com