如何编写MySQL存储过程解析含+-的零件编号,区分范围与追加?
解析含+/-的零件编号:MySQL存储过程方案
核心前提:必须先明确符号语义规则
因为原编号里的-和+存在歧义(既可能是范围/追加标记,也可能是编号本身的字符),程序没法自动判断,必须先和业务方敲定规则,比如:
- 仅当
-前后都是纯数字时,才表示连续范围(例:1-5→1,2,3,4,5),否则-是编号的一部分(例:AB-C123保留原字符) - 仅当
+前后都是纯数字时,才表示追加多个数字(例:1+3→1,3),否则+是编号的一部分(例:X+Y-7保留原字符)
一、先写辅助函数判断纯数字
先创建一个工具函数,用来判断字符串是否是纯数字,方便后续识别符号的语义:
DELIMITER // CREATE FUNCTION is_numeric(str VARCHAR(255)) RETURNS BOOLEAN BEGIN RETURN str REGEXP '^[0-9]+$'; END // DELIMITER ;
二、实现解析存储过程
下面是基础版存储过程框架,可根据实际样本调整细节:
DELIMITER // CREATE PROCEDURE parse_part_number(IN part_num VARCHAR(255), OUT parsed_result TEXT) BEGIN DECLARE curr_pos INT DEFAULT 1; DECLARE total_len INT DEFAULT LENGTH(part_num); DECLARE curr_char CHAR(1); DECLARE temp_str TEXT DEFAULT ''; DECLARE prev_segment VARCHAR(255); DECLARE next_segment VARCHAR(255); DECLARE start_num, end_num INT; SET parsed_result = ''; WHILE curr_pos <= total_len DO SET curr_char = SUBSTRING(part_num, curr_pos, 1); -- 处理可能的范围/追加符号 IF curr_char IN ('-', '+') THEN SET prev_segment = TRIM(LEFT(part_num, curr_pos - 1)); SET next_segment = TRIM(SUBSTRING(part_num, curr_pos + 1)); -- 处理范围标记'-' IF curr_char = '-' AND is_numeric(prev_segment) AND is_numeric(next_segment) THEN SET start_num = CAST(prev_segment AS UNSIGNED); SET end_num = CAST(next_segment AS UNSIGNED); WHILE start_num <= end_num DO SET temp_str = CONCAT(temp_str, start_num, ','); SET start_num = start_num + 1; END WHILE; SET curr_pos = total_len + 1; -- 处理完范围后跳出,多符号场景需调整 -- 处理追加标记'+' ELSEIF curr_char = '+' AND is_numeric(prev_segment) AND is_numeric(next_segment) THEN SET temp_str = CONCAT(temp_str, prev_segment, ',', next_segment); SET curr_pos = total_len + 1; -- 符号是编号本身的一部分,直接保留 ELSE SET temp_str = CONCAT(temp_str, curr_char); SET curr_pos = curr_pos + 1; END IF; ELSE SET temp_str = CONCAT(temp_str, curr_char); SET curr_pos = curr_pos + 1; END IF; END WHILE; -- 清理末尾多余的逗号 SET parsed_result = TRIM(TRAILING ',' FROM temp_str); END // DELIMITER ;
三、优化与扩展建议
- 如果存在多符号混合场景(比如
1-3+5-7),需要修改遍历逻辑,逐个定位并处理每个符号,而不是处理一个就跳出 - 若编号是字母数字混合(比如
A1-3+B5),可以先拆分出纯数字段单独处理符号,再拼接回字母部分 - 针对45000条批量数据,可以用游标遍历数据表,调用存储过程将解析结果存入新增字段
- 要是业务规则实在没法统一,建议先导出数据用Python脚本做预处理(比如通过样本标注、频率统计识别符号语义),再把结果导回MySQL,比纯SQL处理更灵活
内容的提问来源于stack exchange,提问作者Kelsey Butler
相关产品推荐
相关产品推荐

