3 回答
TA贡献1859条经验 获得超6个赞
MySQL中没有使用正则表达式提取文本的语法。您可以使用REGEXP来识别包含两个连续数字的行,但是要提取它们,您必须使用普通的字符串操作函数,在这种情况下这非常困难。
备择方案:
从数据库中选择整个值,然后在客户端上使用正则表达式。
使用对SQL标准有更好支持的其他数据库(我知道这可能不是一个选择)。然后您可以使用:
SUBSTRING(originaltext from '%#[0-9]{2}#%' for '#')
。
TA贡献1797条经验 获得超4个赞
我将代码用作存储过程(函数),可以提取单个块中从数字构建的任何数字。这是我更广泛的图书馆的一部分。
DELIMITER $$
-- 2013.04 michal@glebowski.pl
-- FindNumberInText("ab 234 95 cd", TRUE) => 234
-- FindNumberInText("ab 234 95 cd", FALSE) => 95
DROP FUNCTION IF EXISTS FindNumberInText$$
CREATE FUNCTION FindNumberInText(_input VARCHAR(64), _fromLeft BOOLEAN) RETURNS VARCHAR(32)
BEGIN
DECLARE _r VARCHAR(32) DEFAULT '';
DECLARE _i INTEGER DEFAULT 1;
DECLARE _start INTEGER DEFAULT 0;
DECLARE _IsCharNumeric BOOLEAN;
IF NOT _fromLeft THEN SET _input = REVERSE(_input); END IF;
_loop: REPEAT
SET _IsCharNumeric = LOCATE(MID(_input, _i, 1), "0123456789") > 0;
IF _IsCharNumeric THEN
IF _start = 0 THEN SET _start = _i; END IF;
ELSE
IF _start > 0 THEN LEAVE _loop; END IF;
END IF;
SET _i = _i + 1;
UNTIL _i > length(_input) END REPEAT;
IF _start > 0 THEN
SET _r = MID(_input, _start, _i - _start);
IF NOT _fromLeft THEN SET _r = REVERSE(_r); END IF;
END IF;
RETURN _r;
END$$
添加回答
举报