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

编写循环执行的SQL:为#XX标签添加连续编号

SQL实现连续编号替换#XX标签

核心思路

通过用户变量追踪连续编号,结合字符串替换逻辑,逐个将文本中的#XX替换为带两位数字编号的#XX[NN]格式,确保所有#XX按出现顺序获得唯一连续编号。

解决方案

方法一:使用临时表+嵌套替换(适用于已知最多#XX数量的场景)

-- 初始化计数器变量
SET @counter = 0;

-- 创建临时表存储处理后的结果
CREATE TEMPORARY TABLE temp_processed AS
SELECT 
    LP,
    -- 按顺序替换每个#XX,每次替换后计数器递增
    (SELECT 
        REPLACE(
            REPLACE(
                REPLACE(
                    REPLACE(
                        REPLACE(
                            Text, '#XX', CONCAT('#XX[', LPAD(@counter := @counter + 1, 2, '0'), ']'), 1
                        ), '#XX', CONCAT('#XX[', LPAD(@counter := @counter + 1, 2, '0'), ']'), 1
                    ), '#XX', CONCAT('#XX[', LPAD(@counter := @counter + 1, 2, '0'), ']'), 1
                ), '#XX', CONCAT('#XX[', LPAD(@counter := @counter + 1, 2, '0'), ']'), 1
            ), '#XX', CONCAT('#XX[', LPAD(@counter := @counter + 1, 2, '0'), ']'), 1
    FROM dual) AS Text
FROM your_table;

-- 更新原表数据
UPDATE your_table t
JOIN temp_processed tp ON t.LP = tp.LP
SET t.Text = tp.Text;

-- 清理临时表
DROP TEMPORARY TABLE IF EXISTS temp_processed;
  • 嵌套REPLACE的次数需覆盖单条记录中最多的#XX数量,示例中支持最多5个#XX,可根据实际情况增减。
  • LPAD(@counter := @counter +1, 2, '0')用于生成两位数字编号,不足两位时自动补0。

方法二:存储过程(支持任意数量#XX)

如果单条记录中#XX数量不确定,推荐使用存储过程循环处理:

DELIMITER //

CREATE PROCEDURE ReplaceXXWithSequentialNumbers()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE current_lp INT;
    DECLARE current_text TEXT;
    DECLARE new_text TEXT;
    DECLARE xx_count INT;
    DECLARE idx INT;
    
    -- 声明游标遍历含#XX的记录
    DECLARE data_cursor CURSOR FOR 
        SELECT LP, Text FROM your_table WHERE Text LIKE '%#XX%';
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
    -- 初始化全局计数器
    SET @global_counter = 0;
    
    OPEN data_cursor;
    
    process_loop: LOOP
        FETCH data_cursor INTO current_lp, current_text;
        IF done THEN
            LEAVE process_loop;
        END IF;
        
        SET new_text = current_text;
        -- 计算当前记录中#XX的数量
        SET xx_count = (LENGTH(current_text) - LENGTH(REPLACE(current_text, '#XX', ''))) / 3;
        SET idx = 1;
        
        -- 逐个替换每个#XX
        WHILE idx <= xx_count DO
            SET new_text = REPLACE(new_text, '#XX', CONCAT('#XX[', LPAD(@global_counter := @global_counter +1, 2, '0'), ']'), 1);
            SET idx = idx + 1;
        END WHILE;
        
        -- 更新原记录
        UPDATE your_table SET Text = new_text WHERE LP = current_lp;
    END LOOP;
    
    CLOSE data_cursor;
END //

DELIMITER ;

-- 执行存储过程
CALL ReplaceXXWithSequentialNumbers();

内容的提问来源于stack exchange,提问作者Krzysztof Jankowicz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:00:37