You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

逻辑解释:

  1. 用UNION ALL生成1到12的数字序列,覆盖你所有可能的字符串长度;
  2. 通过CROSS JOIN把每个字符串和数字序列关联,检查每个位置的字符是否为数字;
  3. 用MAX()找到当前字符串中最后一个数字的位置;
  4. 最后用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:06:17