如何从varchar2类型的列中分离出数字
从Oracle VARCHAR2类型带单位字符串中提取数字的实现方案
针对存储了类似(25KG)这类混合数字、单位、特殊符号的VARCHAR2字段,可通过Oracle内置正则函数快速提取数字部分,以下是不同场景的实现方案:
方案1:REGEXP_REPLACE 反向替换非数字字符(通用性最高)
核心逻辑是把所有不属于数字、小数点的字符全部替换为空,直接得到纯数字内容
- 适用场景:单条字段值中仅存在1组有效数字,支持整数、小数提取
- 实现代码:
SELECT REGEXP_REPLACE(你的字段名, '[^0-9.]', '') AS 提取后数字 FROM 你的表名;
- 效果示例:输入
(25KG)输出25,输入(37.8℃)输出37.8
方案2:REGEXP_SUBSTR 正向匹配数字序列
核心逻辑是直接匹配第一个连续的数字(可包含小数点)序列,适合字段中存在多段被非数字字符分隔的数字、仅需提取第一段的场景
- 实现代码:
-- 仅提取正整数、正小数 SELECT REGEXP_SUBSTR(你的字段名, '\d+\.?\d*') AS 提取后数字 FROM 你的表名; -- 如需支持提取负数,调整正则规则即可 SELECT REGEXP_SUBSTR(你的字段名, '-?\d+\.?\d*') AS 提取后数字 FROM 你的表名;
扩展:转换为数值类型用于计算
如果提取的数字需要后续做求和、比较等数值运算,可在外层包裹TO_NUMBER函数完成类型转换:
SELECT TO_NUMBER(REGEXP_REPLACE(你的字段名, '[^0-9.]', '')) AS 数值格式结果 FROM 你的表名;
注意事项:如果字段值存在多个小数点等异常格式,建议先完成异常数据清洗再执行提取逻辑,避免类型转换时报错。
内容的提问来源于stack exchange,提问作者Bishoy
相关产品推荐
相关产品推荐

