需求:從 VARCHAR 欄位中提取所有數字字符 (0-9),合併輸出。例如 'abc123def456' → '123456'。
DELIMITER //
CREATE FUNCTION GetNum(Varstring VARCHAR(50))
RETURNS VARCHAR(30)
DETERMINISTIC
NO SQL
BEGIN
DECLARE v_length INT DEFAULT 0;
DECLARE v_Tmp VARCHAR(50) DEFAULT '';
DECLARE v_char CHAR(1);
SET v_length = CHAR_LENGTH(Varstring);
WHILE v_length > 0 DO
SET v_char = MID(Varstring, v_length, 1);
-- ASCII '0'=48, '9'=57
IF ASCII(v_char) BETWEEN 48 AND 57 THEN
SET v_Tmp = CONCAT(v_Tmp, v_char);
END IF;
SET v_length = v_length - 1;
END WHILE;
RETURN REVERSE(v_Tmp);
END //
DELIMITER ;
SELECT GetNum('dfdfd666'); -- 返回 '666'
SELECT GetNum('dfdd111fd666'); -- 返回 '111666' (非連續數字也能合併)
SELECT GetNum(column_name) FROM table_name;
ASCII() 判斷是否為數字字符 (48-57)。REVERSE() 恢復原序。| 維度 | 評估 |
|---|---|
| 時間複雜度 | O(N) N=字串長度,單行毫秒級 |
| 適用場景 | 臨時查詢、資料清洗、小批量 ETL |
| 大表風險 | 全表掃描逐行執行函數極慢,百萬行可能分鐘級 |
| 替代方案 | 應用層處理 (正則)、生成列 (Generated Column) 物化、ETL 階段預處理 |