背景如下:线上有一个表的字段保存的是逗号分隔的图片链接集合,类似"http://123.jpg?asss=xasda,http://12333.jpg?asss=xasda1"这种。因为配置错误导致部分链接的后缀错误,图片无法访问。需要去掉每个链接?之后的内容,如下:"http://123.jpg,http://12333.jpg"结果。
思路就是:
查出要修改的所有记录,循环,使用CHAR_LENGTH(url)-CHAR_LENGTH(REPLACE(url,',',''))计算字符串逗号的个数num,循环num+1次。
使用SUBSTRING_INDEX(url, ',', i);获取字符串中逗号前的子串http://123.jpg?asss=xasda。使用SUBSTRING_INDEX(str, '?', 1)获取?号前子串http://123.jpg。拼接到结果中CONCAT(str_arr, str, ',')
最后判断去掉结尾的逗号,if (RIGHT(str_arr,1)=',') THEN
set str_arr=LEFT(str_arr,LENGTH(str_arr)-1);
小技巧:存储过程的调式比较困难 ,可以通过在代码中插入SELECT语句来查看变量值如SELECT tid,url;
代码如下:
CREATE PROCEDURE `updateUrl`(in p1 VARCHAR(255))
BEGIN
DECLARE done INT DEFAULT FALSE;
-- 定义字段变量
DECLARE tid INT;
DECLARE url TEXT;
DECLARE i INT DEFAULT 1;
DECLARE num INT DEFAULT 1;
DECLARE str TEXT;
DECLARE str_arr TEXT DEFAULT '';
-- 声明游标变量
DECLARE cur CURSOR FOR SELECT id,img_url_list as url FROM `zhcj_park_record` WHERE create_time>p1 ORDER BY create_time DESC;
-- 定义绑定游标结果的变量有值时done = TRUE
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 打开游标
OPEN cur;
-- 开始循环
loop_label: LOOP
SET str_arr = '';
-- 获取下一条数据
FETCH cur INTO tid, url;
SELECT tid,url;
-- 判断是否已经遍历完所有数据
IF done THEN
LEAVE loop_label;
END IF;
-- 逗号个数
set num= CHAR_LENGTH(url)-CHAR_LENGTH(REPLACE(url,',',''));
WHILE (i <= num+1) DO
SET str = SUBSTRING_INDEX(url, ',', i);
SET url=REPLACE(url,CONCAT(str, ','),'');
SET str = SUBSTRING_INDEX(str, '?', 1);
SET str_arr = CONCAT(str_arr, str, ',');
SELECT str_arr;
SET i = i + 1;
END WHILE;
if (RIGHT(str_arr,1)=',') THEN
set str_arr=LEFT(str_arr,LENGTH(str_arr)-1);
END IF;
-- 执行更新操作
UPDATE zhcj_park_record SET img_url_list = str_arr WHERE id = tid;
END LOOP loop_label;
-- 关闭游标
CLOSE cur;
SELECT 1;
END
CALL updateUrl('2023-09-06 20:00:37');