業務中常遇到「從混雜字符串提取純數字」的需求,如訂單號 ORD-20240501-001 提取 20240501001,或地址 123號樓4單元 提取 1234。MySQL 內建無現成函數,需自行編寫存儲函數。
DELIMITER //
CREATE FUNCTION `GetNum`(Varstring VARCHAR(50))
RETURNS VARCHAR(30)
DETERMINISTIC
BEGIN
DECLARE v_length INT DEFAULT 0;
DECLARE v_Tmp VARCHAR(50) DEFAULT '';
SET v_length = CHAR_LENGTH(Varstring);
WHILE v_length > 0 DO
-- ASCII 48-57 對應 '0'-'9'
IF ASCII(MID(Varstring, v_length, 1)) BETWEEN 48 AND 57 THEN
SET v_Tmp = CONCAT(v_Tmp, MID(Varstring, v_length, 1));
END IF;
SET v_length = v_length - 1;
END WHILE;
-- 逆序還原原始順序
RETURN REVERSE(v_Tmp);
END //
DELIMITER ;
| 輸入字符串 | SQL 呼叫 | 返回結果 | 說明 |
|---|---|---|---|
dfdfd666 | SELECT GetNum('dfdfd666') | 666 | 尾部連續數字 |
dfdd111fd666 | SELECT GetNum('dfdd111fd666') | 111666 | 非連續數字合併 |
ORD-20240501-001 | SELECT GetNum('ORD-20240501-001') | 20240501001 | 實際業務場景 |
無數字文本 | SELECT GetNum('abc') | '' | 返回空字符串 |
-- 查詢訂單表,提取 order_sn 中的純數字部分
SELECT order_id, GetNum(order_sn) AS pure_num
FROM `order`
WHERE order_sn REGEXP '[0-9]';
CHAR_LENGTH 計算字符數而非字節,函數邏輯正確。REGEXP_REPLACE(str, '[^0-9]', '') 替代(需 8.0.4+)。-- 無需自定義函數,單條 SQL 完成
SELECT REGEXP_REPLACE('dfdd111fd666', '[^0-9]', '') AS pure_num;
-- 結果:111666
根據版本選擇方案:5.7 及以下用自定義函數,8.0+ 直接用正則替換,更簡潔高效。