MYSQL EXTRACTVALUE按XML节点过滤返回空值问题求助
解决MySQL EXTRACTVALUE按节点值过滤返回空的问题
别担心,这是XPath新手常犯的典型小错误——你的查询语句里的XPath路径搞错了匹配逻辑,导致找不到目标节点。
问题原因分析
你写的查询语句是:
EXTRACTVALUE(@xml,'//GS-Pay//index//Step-One[@year="2017"]')
这里的@year="2017"是在寻找Step-One节点自身的year属性,但看你的XML结构,year是index节点的子节点,并不是Step-One的属性,自然匹配不到任何内容,所以返回空值。
正确的解决方法
我们需要先过滤出包含year="2017"的index节点,再获取该节点下的Step-One值,正确的XPath写法有两种:
写法1:直接过滤index节点
EXTRACTVALUE(@xml,'//GS-Pay/index[year="2017"]/Step-One')
这个路径的逻辑是:
- 找到所有
GS-Pay节点下的index子节点 - 过滤出其中
year子节点值为2017的index节点 - 提取这些
index节点下的Step-One节点的值
写法2:更明确的子节点匹配(效果和写法1一致)
如果担心层级混淆,可以用./明确指定year是当前index的子节点:
EXTRACTVALUE(@xml,'//GS-Pay//index[./year="2017"]/Step-One')
测试验证
把正确的语句放到你的场景里测试:
SET @xml = '<GS-Pay> <index> <year>2017</year> <Step-One>28000</Step-One> <Step-Two>45000</Step-Two> </index> <index> <year>2018</year> <Step-One>30000</Step-One> <Step-Two/> </index> <index> <year>2019</year> <Step-One>50000</Step-One> <Step-Two>60000</Step-Two> </index> <total> </total> </GS-Pay>'; SELECT EXTRACTVALUE(@xml,'//GS-Pay/index[year="2017"]/Step-One');
执行后会返回你期望的结果:28000
额外提示
记住XPath的两个基础规则:
@节点名:表示匹配当前节点的属性节点名:表示匹配当前节点的子节点
以后按节点值过滤的时候,一定要搞清楚目标值所在的层级哦!
内容的提问来源于stack exchange,提问作者zezee
相关产品推荐
相关产品推荐

