MySQL:如何从字符串中删除所有单个字符?

时间:2011-08-05 17:29:47

标签: mysql string replace

在MySQL中,我需要从字符串中删除所有单个字符:

"A Quick Brown B C D Fox" - > "Quick Brown Fox"

任何提示?

2 个答案:

答案 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//