我正在尝试删除换行符,当下一个字符也是换行符时,使用我在下面写的函数,我遇到了一个问题。当我输入这个字符串时:
"Line1
Line2
Line3
Line4"
它删除了第1行和第2行之后的换行符,但保留了第3行和第4行之间的行?有什么想法解释为什么这个函数不能工作吗?
DELIMITER $$
DROP FUNCTION IF EXISTS removeLines;
CREATE FUNCTION test_dev.removeLines(address varchar(255))
RETURNS varchar(255)
DETERMINISTIC
BEGIN
DECLARE i int;
SET i = 0;
WHILE i < length(address)-1 DO
IF(((SUBSTR(address,i,1) in (CHAR(10) ,CHAR(13))) AND (SUBSTR(address,i+1,1) in (CHAR(10) ,CHAR(13))) ) )
THEN set address = INSERT(address,i,1,'');
SET i= i+1;
ELSE set i= i+1;
END IF;
END WHILE;
RETURN address;
END$$
DELIMITER ;
发布于 2018-09-04 06:38:29
问题是您在替换换行符之后递增i
。考虑下面这个简单的字符串:
1\n\n\n2
01 2 3 4 -- indexes
当i
为1
时,您会看到索引i=1
和i+1=2
处有换行符,因此使用INSERT()
删除第一行。现在字符串是:
1\n\n2
01 2 3
然后你做SET i = i + 1
。现在i
是2,但是索引i=2
和i+1=3
没有换行符,所以不需要删除下一个换行符。
将其更改为仅在找不到两个换行符时递增i
。
IF(((SUBSTR(address,i,1) in (CHAR(10) ,CHAR(13))) AND (SUBSTR(address,i+1,1) in (CHAR(10) ,CHAR(13))) ) )
THEN set address = INSERT(address,i,1,'');
ELSE set i= i+1;
END IF;
发布于 2018-09-04 07:19:23
另一种编写函数的方法,这样您就不必手动跟踪字符索引。
while instr(address, '\r\n\r\n') do
address = replace(address, '\r\n\r\n', '\r\n');
end while;
我没有机会在数据库中测试它,所以语法可能不是100%正确的。
https://stackoverflow.com/questions/52156627
复制相似问题