编写循环执行的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
相关产品推荐
相关产品推荐

