在MySQL中,我需要从字符串中删除所有单个字符:
"A Quick Brown B C D Fox"
- > "Quick Brown Fox"
任何提示?
答案 0 :(得分:1)
如果你可以在mysql(php,.net,perl)之外处理它,你可以使用正则表达式来轻松完成。不幸的是,Mysql的正则表达式引擎只会告诉您是否匹配,而不是匹配的内容。
答案 1 :(得分:0)
您希望[[:<:]]
和[[:>:]]
在MySQL中搜索字边界。 (在其他正则表达式中,\b
,PERL,grep等。)
因此...
'[[:<:]][a-zA-Z0-9][[:>:]]'
会找到任何单个字符。
好吧,试试这个......
这是基于上面的功能,但硬编码以查找单个字符。我并不认为这不仅仅是一个黑客攻击。但是如果你需要完成工作,并且由于某种原因你无法安装外部库,它不会减慢你没有任何单个字符要替换的字符串:
delimiter //
DROP FUNCTION IF EXISTS `REMOVE_SINGLE_CHARS`//
CREATE FUNCTION `REMOVE_SINGLE_CHARS`(original varchar(1000)) RETURNS varchar(1000) CHARSET utf8 DETERMINISTIC
BEGIN
DECLARE rxChars VARCHAR(20);
DECLARE temp VARCHAR(1000);
DECLARE ch1 CHAR(1);
DECLARE ch2 CHAR(1);
DECLARE ch3 CHAR(1);
DECLARE i INT;
SET rxChars = '[a-zA-Z0-9]';
SET i = 1;
SET temp = "";
IF original REGEXP CONCAT('[[:<:]]',rxChars,'[[:>:]]') THEN
loop_label: LOOP
set ch1 = SUBSTRING(original,i,1);
if CHAR_LENGTH(original) > i THEN
set ch2 = SUBSTRING(original,i+1,1);
END IF;
if CHAR_LENGTH(original) > i+1 THEN
set ch3 = SUBSTRING(original,i+2,1);
END IF;
if(i = 1) THEN
IF (ch1 NOT regexp rxChars OR ch2 regexp rxChars) THEN
set temp = CONCAT(temp, ch1);
END IF;
END IF;
IF(ch2 = ' ') THEN
# Theoretically this is redundant, but for some reason the
# CONCAT(temp, ch2) below is not working when ch2 = ' ' YMMV
set temp = CONCAT(temp, ' ');
ELSE
IF(ch2 NOT regexp rxChars OR ch1 regexp rxChars OR (i+1<CHAR_LENGTH(original) AND ch3 regexp rxChars)) THEN
set temp = CONCAT(temp, ch2);
END IF;
END IF;
IF i+2>CHAR_LENGTH(original) THEN
LEAVE loop_label;
END IF;
SET i=i+1;
END LOOP;
ELSE
SET temp = original;
END IF;
RETURN temp;
END//