如何在MySQL中从字符串里提取纯数字序列?
MySQL提取remarks列中的数字部分解决方案
问题分析
你之前用regexp_substr只得到第一个匹配的数字片段,是因为该函数默认仅返回第一个符合正则的子串,没法一次性提取所有数字部分并拼接成预期格式。
解决方案(MySQL 8.0+)
用REGEXP_REPLACE函数直接替换字符串中所有非数字、非逗号的字符为空,就能得到目标结果:
SELECT remarks, REGEXP_REPLACE(remarks, '[^0-9,]', '') AS extracted_numbers FROM your_table_name;
效果说明
针对示例数据Will0017,Will0018, Kind0045 , DGRG0012,这条语句会:
- 移除所有字母(比如
Will、Kind、DGRG) - 移除所有空格
- 保留逗号和数字,最终输出
0017,0018,0045,0012
低版本兼容方案(MySQL < 8.0)
如果你的MySQL版本不支持REGEXP_REPLACE,可以创建自定义函数遍历字符串提取数字:
DELIMITER // CREATE FUNCTION extract_numbers(str VARCHAR(255)) RETURNS VARCHAR(255) DETERMINISTIC BEGIN DECLARE result VARCHAR(255) DEFAULT ''; DECLARE i INT DEFAULT 1; DECLARE len INT DEFAULT LENGTH(str); DECLARE char CHAR(1); WHILE i <= len DO SET char = SUBSTRING(str, i, 1); IF char IN ('0','1','2','3','4','5','6','7','8','9', ',') THEN SET result = CONCAT(result, char); END IF; SET i = i + 1; END WHILE; -- 清理多余逗号 SET result = TRIM(BOTH ',' FROM result); SET result = REGEXP_REPLACE(result, ',+', ','); RETURN result; END // DELIMITER ;
调用函数查询:
SELECT remarks, extract_numbers(remarks) AS extracted_numbers FROM your_table_name;
内容的提问来源于stack exchange,提问作者Manish Chaudhary
相关产品推荐
相关产品推荐

