MySQL 5.6.10如何删除字符串最后一个整数后的内容?
解决MySQL 5.6中提取字符串最后一个数字前部分的问题
针对你提到的需求——从类似BOL01RUM、BOL050FAG的字符串中保留到最后一个数字的部分(比如BOL01、BOL050),因为MySQL 5.6没有REGEXP_SUBSTR这类便捷的正则截取函数,咱们可以用两种可行的方案:
方案一:纯SQL语句(无需自定义函数)
核心思路是生成1到12的数字序列(匹配你字符串9-12的长度范围),逐个检查每个位置的字符是否为数字,找到最靠后的数字位置,再截取对应长度的子串。
示例代码如下(假设你的表名为test,目标字段为code):
SELECT t.code, SUBSTRING(t.code, 1, MAX(CASE WHEN SUBSTRING(t.code, n.n, 1) REGEXP '[0-9]' THEN n.n ELSE 0 END)) AS target_part FROM test t CROSS JOIN (SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12) n WHERE n.n <= LENGTH(t.code) GROUP BY t.code;
逻辑解释:
- 用
UNION ALL生成1到12的数字序列,覆盖你所有可能的字符串长度; - 通过
CROSS JOIN把每个字符串和数字序列关联,检查每个位置的字符是否为数字; - 用
MAX()找到当前字符串中最后一个数字的位置; - 最后用
SUBSTRING()截取从开头到该位置的子串,得到想要的结果。
方案二:自定义函数(更简洁)
如果你的业务场景需要多次使用这个逻辑,写一个自定义函数会更方便。函数的逻辑是从字符串末尾往前遍历,找到第一个数字的位置,返回该位置供截取使用。
第一步:创建函数
DELIMITER // CREATE FUNCTION get_last_digit_position(str VARCHAR(12)) RETURNS INT DETERMINISTIC BEGIN DECLARE current_pos INT DEFAULT LENGTH(str); WHILE current_pos > 0 DO -- 检查当前位置的字符是否为数字 IF SUBSTRING(str, current_pos, 1) REGEXP '[0-9]' THEN RETURN current_pos; END IF; SET current_pos = current_pos - 1; END WHILE; -- 如果字符串中没有数字,返回0(可根据需求调整) RETURN 0; END // DELIMITER ;
第二步:使用函数查询
SELECT code, SUBSTRING(code, 1, get_last_digit_position(code)) AS target_part FROM test;
这个方案代码更简洁,可读性也更高,适合重复调用的场景。
内容的提问来源于stack exchange,提问作者Christián De Achával
相关产品推荐
相关产品推荐

