如何移除SQL列中的所有字母,仅保留数字?
解决数据库列中移除字母仅保留数字的问题
我来帮你搞定这个数据库清洗的问题!要移除指定列里的所有字母、只保留数字(比如把abc123def转成123),不同数据库的实现方式略有不同,下面是主流数据库的解决方案,记得操作前先备份数据或者先跑查询验证结果哦:
MySQL/MariaDB 解决方案
直接用REGEXP_REPLACE函数匹配所有非数字字符并替换为空:
-- 先验证结果是否符合预期 SELECT your_column, REGEXP_REPLACE(your_column, '[^0-9]', '') AS cleaned_column FROM your_table; -- 确认没问题后执行更新(只更新包含非数字的行,提升效率) UPDATE your_table SET your_column = REGEXP_REPLACE(your_column, '[^0-9]', '') WHERE your_column REGEXP '[^0-9]';
这里的[^0-9]是正则表达式,代表“不是0-9的任意字符”,把它们全部替换成空字符串就得到纯数字了。
PostgreSQL 解决方案
PostgreSQL同样支持REGEXP_REPLACE,用法和MySQL几乎一致:
-- 先验证 SELECT your_column, REGEXP_REPLACE(your_column, '[^0-9]', '', 'g') AS cleaned_column FROM your_table; -- 执行更新 UPDATE your_table SET your_column = REGEXP_REPLACE(your_column, '[^0-9]', '', 'g') WHERE your_column ~ '[^0-9]';
注意这里的'g'参数表示全局替换(确保所有非数字字符都被移除),~是PostgreSQL里的正则匹配运算符。
SQL Server 解决方案
如果你的SQL Server是2016及以上版本,直接用REGEXP_REPLACE即可:
-- 验证 SELECT your_column, REGEXP_REPLACE(your_column, '[^0-9]', '') AS cleaned_column FROM your_table; -- 更新 UPDATE your_table SET your_column = REGEXP_REPLACE(your_column, '[^0-9]', '') WHERE your_column LIKE '%[^0-9]%';
如果是2016以前的版本,没有内置正则函数,可以创建一个自定义函数来提取数字:
CREATE FUNCTION dbo.ExtractNumbers(@input VARCHAR(MAX)) RETURNS VARCHAR(MAX) AS BEGIN DECLARE @output VARCHAR(MAX) = ''; DECLARE @i INT = 1; WHILE @i <= LEN(@input) BEGIN IF SUBSTRING(@input, @i, 1) BETWEEN '0' AND '9' SET @output = @output + SUBSTRING(@input, @i, 1); SET @i = @i + 1; END RETURN @output; END; -- 使用函数验证结果 SELECT your_column, dbo.ExtractNumbers(your_column) AS cleaned_column FROM your_table; -- 执行更新 UPDATE your_table SET your_column = dbo.ExtractNumbers(your_column) WHERE your_column LIKE '%[^0-9]%';
Oracle 解决方案
Oracle的REGEXP_REPLACE用法也很直观:
-- 先验证 SELECT your_column, REGEXP_REPLACE(your_column, '[^0-9]', '') AS cleaned_column FROM your_table; -- 执行更新 UPDATE your_table SET your_column = REGEXP_REPLACE(your_column, '[^0-9]', '') WHERE REGEXP_LIKE(your_column, '[^0-9]');
重要提醒
- 操作前务必备份数据,或者先执行
SELECT语句确认清洗后的结果完全符合预期,再执行UPDATE - 如果表数据量很大,建议分批更新(比如加上
LIMIT或者TOP限制每次更新的行数),避免长时间锁表影响业务 - 如果列原本应该是数字类型,清洗完成后可以考虑修改列的数据类型为
INT/BIGINT等,从根源上避免后续再导入字母
内容的提问来源于stack exchange,提问作者Salvador Cervantes
相关产品推荐
相关产品推荐

