SQL 里面从字符串提取数字,没有所有数据库通用的一条固定万能语句,核心思路是依靠正则匹配 字符遍历 自定义函数这几种方案,SQL Server 支持 PATINDEX 和 STRING_AGG 配合循环或者自定义函数,MySQL 可以使用 REGEXP_REPLACE 正则替换直接把非数字字符全部剔除,Oracle 使用 REGEXP_SUBSTR 正则提取连续数字,不同数据库函数名称不一样,所以写语句之前一定要确认自己是 MySQL SQL Server Oracle 哪一种数据库,常见业务场景是编码里面混有字母和数字,比如订单编码 A0012B,需要单独把里面的 0012 数字提取出来转换成数值类型,还要区分两种需求,第一种是提取连续的一段数字,第二种是把字符串里面所有零散数字全部提取拼接,两种需求写法不一样,如果字符串里面有多段独立数字,正则提取只会默认取出第一段,这点是新手最容易踩坑的地方,提取完成之后一般还要使用 CAST 或者 CONVERT 转成数值类型,方便后续排序 计算 关联表。
一 各数据库提取方案总览表格
| 数据库 | 推荐方案 | 核心函数 | 适用需求 |
|---|---|---|---|
| MySQL | 正则替换 | REGEXP_REPLACE | 剔除全部非数字,保留所有数字 |
| SQL Server | 正则 + 自定义函数 PATINDEX | PATINDEX STRING_AGG | 提取连续数字,循环逐字符筛选 |
| Oracle | 正则截取 | REGEXP_SUBSTR REGEXP_REPLACE | 提取第一段连续数字或者清除非数字 |
| PostgreSQL | 正则函数 | REGEXP_REPLACE | 正则过滤非数字字符 |
二 MySQL 提取数字语句深度讲解
MySQL 8.0 之后自带 REGEXP_REPLACE,这个是最简单的方案,原理就是把所有不是 0 到 9 的字符全部替换成空,剩下的内容就是纯数字。
语句思路
REGEXP_REPLACE 原字段名 '[^0-9]' ''
说明 方括号里面的 ^ 代表取反,也就是匹配所有非数字字符,替换为空字符串,适合字符串里面字母符号混杂,想要全部保留数字的场景。
如果只想提取第一段连续数字,可以搭配正则模式 '[0-9]+' 做匹配提取。
注意事项 MySQL 5.7 以及更早版本没有 REGEXP_REPLACE,这种老版本就需要写存储过程循环遍历每一个字符判断是否为数字。
三 SQL Server 提取数字语句深度讲解
SQL Server 没有原生正则替换函数,常用两种方式,第一种使用 PATINDEX 定位第一个数字出现位置,然后 SUBSTRING 截取连续数字,第二种是编写自定义标量函数,逐字符判断 ASCII 码,筛选出数字字符拼接。
PATINDEX 思路
PATINDEX '%[0-9]%' 用来找到第一个数字的起始下标,然后 SUBSTRING 截取后面连续数字。
局限 这个写法适合只提取第一段连续数字,如果字符串有多段数字,就需要自定义函数或者 CTE 循环拼接全部数字。
进阶方案 可以使用 STRING_AGG,配合数字辅助表,拆分字符之后筛选数字,适合新版 SQL Server。
四 Oracle 提取数字语句深度讲解
Oracle 的 REGEXP_SUBSTR 非常适合直接抓取第一段连续数字,语法是 REGEXP_SUBSTR 字段 '[0-9]+',加号代表匹配一个或者多个连续数字。
如果需求是删除所有非数字字符,就使用 REGEXP_REPLACE 字段 '[^0-9]' ''
要点 Oracle 正则区分大小写,数字模式不需要区分大小写,提取之后如果需要计算,使用 TO_NUMBER 转成数值,遇到空字符串会报错,需要加 NVL 做空值处理。
五 实操编写步骤
第一步 确认数据库版本,判断是否支持原生正则函数
第二步 确认业务需求,是提取第一段连续数字,还是全部零散数字拼接
第三步 编写正则或者截取语句,先单独测试样例字符串,验证结果是否正确
第四步 如果提取出来是字符串类型,使用 CAST CONVERT TO_NUMBER 转成数值类型
第五步 加入 WHERE 或者 SELECT 字段,应用到数据表查询
第六步 测试边界情况,字符串没有数字,字符串全部是数字,数字在开头中间末尾,多段数字场景
六 常见边界问题清单
第一 字符串里面没有任何数字,提取结果是空字符串,后续转数值容易报错,需要加空值判断
第二 数字前后有小数点负号,如果业务需要保留小数点,正则模式就不能只写 0 到 9,需要增加点号和负号
第三 多段数字,只提取第一段会丢失后面数字,需要修改正则或者使用循环拼接
第四 不同数据库正则语法有细微差别,MySQL Oracle SQL Server 正则不能直接复制混用
第五 提取出来的数字仍然是文本类型,排序的时候会出现文本排序错误,必须转成数值类型
七 常见误区
误区 1 认为所有 SQL 数据库都有 REGEXP_REPLACE,SQL Server 旧版本是没有这个函数的
误区 2 正则 [^0-9] 是只保留数字,很多新手理解成只删除数字,写反逻辑
误区 3 提取完不需要类型转换,文本数字和真正数值在排序计算上结果不一样
误区 4 一条语句可以同时提取所有分段数字,默认正则 [0-9]+ 只会匹配第一段连续数字
【常见问题】
问题 1 sql 中取字符串中的数字语句 MySQL 老版本没有正则函数怎么办
回答 1 sql 中取字符串中的数字语句,MySQL5.7 老版本没有 REGEXP_REPLACE,sql 中取字符串中的数字语句需要编写存储过程,循环遍历字符串每一个字符,判断是否是数字然后拼接,实现提取数字的效果。
问题 2 sql 中取字符串中的数字语句 怎么提取多段独立数字
回答 2 sql 中取字符串中的数字语句,如果要提取多段独立数字,默认 REGEXP_SUBSTR 只会取出第一段,sql 中取字符串中的数字语句需要使用辅助表拆分字符或者自定义函数,把所有数字字符全部拼接输出。
问题 3 sql 中取字符串中的数字语句 提取之后是空怎么办
回答 3 sql 中取字符串中的数字语句,如果原字符串不存在数字,提取结果为空,sql 中取字符串中的数字语句后续转数值会报错,需要增加 NVL 或者 CASE 判断,对空值做默认值处理。
问题 4 sql 中取字符串中的数字语句 SQL Server 怎么提取第一段连续数字
回答 4 sql 中取字符串中的数字语句,SQL Server 可以使用 PATINDEX 定位第一个数字起始位置,再搭配 SUBSTRING 截取,sql 中取字符串中的数字语句这个方案适合只抓取第一段连续数字的业务场景。
【免责申明】
本文 sql 中取字符串中的数字语句仅作为 SQL 学习参考,不同数据库版本正则函数支持情况 正则语法存在差异,生产环境执行前请在测试库验证,本文不承担因为正则写错 类型转换异常带来的数据计算错误相关责任。


