低版本MySQL5.7如何截取数字

背景:数据库是MySQL5.7的,没有正则表达式,如何把数字截取出来。比如318、415,百度了一圈还是没有找到解决的方法

img

MySQL5.7应该有正则表达式的。手头没环境不能验证,提供一个思路你试下:使用正则表达式'[0-9]+'先将数字替换成'',然后用剩余部分去替换原字段,将剩余部分替换为'',剩下数字。
不使用正则表达式,这个函数循环每一个字符,根据ASCII码判断是否数字,返回第一个数字的位置,从1开始。没有就返回0。pData CHAR(50)为输入数据,长度可以根据需要修改:

-- 创建函数,指定语句分隔符,不同于普通SQL语句
DELIMITER //;
-- 找出输入数据中第一个数字的位置
CREATE FUNCTION first_int_index(pData CHAR(50), startPos INT)
RETURNS INT
BEGIN
    DECLARE vPos INT DEFAULT startPos;
    DECLARE vChar INT;
    WHILE vPos <= LENGTH(pData) DO
        SET vChar = ASCII(SUBSTR(pData,vPos,1));
        IF vChar BETWEEN 48 AND 57 THEN
            RETURN vPos;
        END IF;
        SET vPos = vPos + 1;
    END WHILE;
    RETURN 0;
END//
-- 找出输入数据中数字出现的长度
CREATE FUNCTION int_length(pData CHAR(50), startPos INT)
RETURNS INT
BEGIN
    DECLARE vPos INT DEFAULT startPos;
    DECLARE vChar INT;
    DECLARE vLen INT DEFAULT 0;
    WHILE vPos <= LENGTH(pData) DO
        SET vChar = ASCII(SUBSTR(pData,vPos,1));
        IF vChar BETWEEN 48 AND 57 THEN
            SET vPos = vPos + 1;
            SET vLen = vLen + 1;
        ELSE
            RETURN vLen;
        END IF;
    END WHILE;
    RETURN 0;
END//
-- 指定回原来的语句分隔符
DELIMITER ;//
-- 使用函数截取数字,如果有多处数字,第二处在first_int_index中指定开始位置即可
SELECT SUBSTR(names, first_int_index(names, 1), int_length(names, first_int_index(names))) from test20230423;

如果输入数据较长,适合另一种方式,循环从0到9,每个数字到输入数据里查第一个出现的位置,如:INSTR(pData,'0'),取这些位置的最小值。