3 回答

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個贊
MySQL中沒有使用正則表達(dá)式提取文本的語法。您可以使用REGEXP來識別包含兩個連續(xù)數(shù)字的行,但是要提取它們,您必須使用普通的字符串操作函數(shù),在這種情況下這非常困難。
備擇方案:
從數(shù)據(jù)庫中選擇整個值,然后在客戶端上使用正則表達(dá)式。
使用對SQL標(biāo)準(zhǔn)有更好支持的其他數(shù)據(jù)庫(我知道這可能不是一個選擇)。然后您可以使用:
SUBSTRING(originaltext from '%#[0-9]{2}#%' for '#')
。

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個贊
我將代碼用作存儲過程(函數(shù)),可以提取單個塊中從數(shù)字構(gòu)建的任何數(shù)字。這是我更廣泛的圖書館的一部分。
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$$
添加回答
舉報