把“aa,bb,cc,dd,aa,bb,cc,dd” 字符串中重复的内容去除。 还是用截取的方式,一个一个截取,然后进行拼接,拼接前用find_in_set函数来判断,是否已经存在? 如果不存在,进行拼接,存在就忽略,继续往下查找。
函数:
ROP PROCEDURE IF EXISTS func_remove_duplicates;
DELIMITER $$
CREATE FUNCTION func_remove_duplicates(inputString VARCHAR(4000))
RETURNS VARCHAR(4000)
BEGIN
DECLARE startPos INT;
DECLARE endPos INT;
DECLARE element VARCHAR(255);
DECLARE outputString VARCHAR(4000) DEFAULT '';
SET outputString = SUBSTRING_INDEX(inputString, ',', 1);
-- 遍历字符串中的每个元素
string_loop: LOOP
-- 查找下一个逗号的位置
SET startPos = IFNULL(LOCATE(',', inputString), 0);
-- 如果找不到逗号,说明已经到了最后一个元素
IF startPos = 0 THEN
SET element = inputString;
ELSE
SET element = SUBSTRING(inputString, 1, startPos - 1);
END IF;
-- 添加元素到输出字符串,如果元素不在输出字符串中
IF FIND_IN_SET(element, outputString) = 0 THEN
SET outputString = CONCAT(outputString, ',', element);
END IF;
-- 如果已经到达字符串末尾,则退出循环
IF startPos = 0 THEN
LEAVE string_loop;
END IF;
-- 剔除已处理的元素并继续下一个迭代
SET endPos = LENGTH(inputString);
SET inputString = SUBSTRING(inputString, startPos + 1, endPos);
END LOOP;
RETURN outputString;
END$$
DELIMITER ;
调用:
SELECT func_remove_duplicates('aa,bb,cc,dd,aa,bb,cc,dd');
过程:
ROP PROCEDURE IF EXISTS pro_remove_duplicates;
DELIMITER $$
CREATE PROCEDURE pro_remove_duplicates(inputString VARCHAR(255), OUT outputString VARCHAR(255))
BEGIN
DECLARE startPos INT;
DECLARE endPos INT;
DECLARE element VARCHAR(255);
-- 初始化 outputString
SET outputString = SUBSTRING_INDEX(inputString, ',', 1);
-- 遍历字符串中的每个元素
string_loop: LOOP
-- 查找下一个逗号的位置
SET startPos = IFNULL(LOCATE(',', inputString), 0);
-- 如果找不到逗号,说明已经到了最后一个元素
IF startPos = 0 THEN
SET element = inputString;
ELSE
SET element = SUBSTRING(inputString, 1, startPos - 1);
END IF;
-- 添加元素到输出字符串,如果元素不在输出字符串中
IF FIND_IN_SET(element, outputString) = 0 THEN
SET outputString = CONCAT(outputString, ',', element);
END IF;
-- 如果已经到达字符串末尾,则退出循环
IF startPos = 0 THEN
LEAVE string_loop;
END IF;
-- 剔除已处理的元素并继续下一个迭代
SET endPos = LENGTH(inputString);
SET inputString = SUBSTRING(inputString, startPos + 1, endPos);
END LOOP;
-- 输出内容
SELECT outputString;
END$$
DELIMITER ;
调用:
CALL pro_remove_duplicates('aa,bb,cc,dd,aa,bb,cc,dd', @result);
总结:
mysql字符串去重,一般都是程序那边处理,很少sql去处理,如果是mysql事件里面调用,就用过程去处理。