You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 11:27:04