无UPDATE权限时,如何在SQL中去除varchar列首尾的字母
嘿,这个需求我太熟了!因为没有UPDATE权限,咱们没法直接修改表中的数据,所以只能在查询的时候动态提取出字符串里的数字部分。下面分几种常见的数据库给你具体的实现方案:
不同数据库的具体实现
MySQL/MariaDB
如果你的MySQL版本是8.0及以上,直接用REGEXP_REPLACE函数就能搞定,它可以把所有非数字的字符替换成空字符串:
SELECT REGEXP_REPLACE(your_column_name, '[^0-9]', '') AS only_numbers FROM your_table_name;
要是你的版本低于8.0(没有REGEXP_REPLACE),可以考虑嵌套REPLACE把所有字母逐个替换掉,但这种方法比较繁琐(得把A-Z、a-z都列出来),优先建议升级版本或者用上面的方法。
SQL Server
SQL Server 2017及以上版本同样支持REGEXP_REPLACE,用法和MySQL差不多:
SELECT REGEXP_REPLACE(your_column_name, '[^0-9]', '') AS only_numbers FROM your_table_name;
如果是更旧的版本,咱们可以写一个自定义函数来遍历字符串,只保留数字字符:
CREATE FUNCTION dbo.ExtractNumbers (@input VARCHAR(20)) RETURNS VARCHAR(20) AS BEGIN DECLARE @output VARCHAR(20) = '' 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 dbo.ExtractNumbers(your_column_name) AS only_numbers FROM your_table_name;
PostgreSQL
PostgreSQL里用REGEXP_REPLACE也很方便,记得加上'g'参数做全局替换,确保所有非数字字符都被清除:
SELECT REGEXP_REPLACE(your_column_name, '[^0-9]', '', 'g') AS only_numbers FROM your_table_name;
Oracle
Oracle提供了两种常用方法:
- 使用
REGEXP_REPLACE:
SELECT REGEXP_REPLACE(your_column_name, '[^0-9]', '') AS only_numbers FROM your_table_name;
- 使用
TRANSLATE函数,这种方法性能可能更好一些:
SELECT TRANSLATE(your_column_name, '0123456789' || your_column_name, '0123456789') AS only_numbers FROM your_table_name;
这些方法都是在查询时动态处理数据,完全不会修改原表的内容,刚好符合你没有UPDATE权限的情况。如果你的数据库不在上面的列表里,可以告诉我具体类型,我再给你调整方案~
内容的提问来源于stack exchange,提问作者Trent
相关产品推荐
相关产品推荐

