在数据库存储场景中,经常会遇到将结构化数据以XML格式存储到字段中的情况,此时需要从XML内容里提取指定节点的值,SQL提供的EXTRACTVALUE函数配合XPath语法就能高效完成这个操作。
EXTRACTVALUE函数基本语法
EXTRACTVALUE是MySQL等数据库中用于从XML字符串中提取节点值的函数,基本语法如下:
EXTRACTVALUE(xml_str, xpath_expr)
其中xml_str是待解析的XML格式字符串,xpath_expr是符合XPath规范的路径表达式,函数会返回匹配到的第一个节点的文本内容。
XPath常用语法规则
要正确使用EXTRACTVALUE函数,需要先了解XPath的基础语法,常用的表达式规则如下:
/:从根节点开始选取//:从匹配选择的当前节点选择文档中的节点,不考虑位置@:选取属性[]:添加筛选条件,比如按索引、属性值筛选text():获取节点的文本内容
基础提取示例
假设我们有如下XML字符串,需要提取book节点下title子节点的值:
-- 定义XML字符串
SET @xml = '<bookstore>
<book>
<title>SQL基础教程</title>
<author>张三</author>
<price>59.9</price>
</book>
</bookstore>';
-- 提取title节点的值
SELECT EXTRACTVALUE(@xml, '/bookstore/book/title') AS book_title;
执行上述语句后,会返回结果SQL基础教程,这里/bookstore/book/title表示从根节点bookstore开始,依次找到book子节点,再找到title子节点,提取其文本内容。
复杂场景提取示例
提取带属性的节点值
如果XML节点带有属性,需要提取属性值的话,可以使用@属性名的语法:
SET @xml = '<user>
<info id="1001">
<name>李四</name>
<age>25</age>
</info>
</user>';
-- 提取info节点的id属性值
SELECT EXTRACTVALUE(@xml, '/user/info/@id') AS user_id;
执行后会返回1001,即id属性的对应值。
提取多个同名节点中的指定节点
当存在多个同名的子节点时,可以通过索引筛选,XPath的索引从1开始:
SET @xml = '<bookstore>
<book>
<title>SQL基础教程</title>
</book>
<book>
<title>XPath语法详解</title>
</book>
</bookstore>';
-- 提取第二个book节点的title值
SELECT EXTRACTVALUE(@xml, '/bookstore/book[2]/title') AS second_book_title;
执行后返回XPath语法详解,这里[2]表示选取第二个book节点。
提取深层嵌套节点的值
对于嵌套层级较深的节点,也可以使用//忽略中间层级直接匹配:
SET @xml = '<root>
<a>
<b>
<c>目标内容</c>
</b>
</a>
</root>';
-- 忽略中间层级直接提取c节点的值
SELECT EXTRACTVALUE(@xml, '//c') AS target_content;
执行后返回目标内容,//c表示匹配文档中所有的c节点,返回第一个匹配到的节点的内容。
使用注意事项
- EXTRACTVALUE函数只能返回匹配到的第一个节点的文本内容,如果需要提取多个同名节点的所有值,该函数无法满足需求,需要结合其他XML解析方式实现。
- XPath表达式必须符合规范,如果表达式语法错误,函数会返回NULL或者报错。
- 如果XML字符串中存在命名空间,需要在XPath表达式中正确处理命名空间,否则可能无法匹配到对应节点。
- 不同数据库对EXTRACTVALUE函数的支持情况不同,比如Oracle也有同名函数但语法略有差异,使用时需要参考对应数据库的官方文档。
需要注意的是,在MySQL 5.7及以上版本中,EXTRACTVALUE函数已经被标记为 deprecated,官方建议使用XMLTABLE等更标准的XML解析方式替代,但存量系统中仍然有大量使用该函数的场景,掌握其用法仍有实际价值。
SQLEXTRACTVALUEXPathXML解析修改时间:2026-07-14 21:42:35