背景:数据库是MySQL5.7的,没有正则表达式,如何把数字截取出来。比如318、415,百度了一圈还是没有找到解决的方法
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'),取这些位置的最小值。