MySQL: как удалить все одиночные символы из строки? - PullRequest
2 голосов
/ 05 августа 2011

В MySQL мне нужно удалить все отдельные символы из строки:

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

Любые советы?

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Если вы можете обработать его вне mysql (php, .net, perl), вы можете использовать регулярные выражения, чтобы сделать это довольно легко. К сожалению, механизм регулярных выражений Mysql сообщает вам только о совпадении, а не о том, что было найдено.

0 голосов
/ 06 августа 2011

Вы хотите [[:<:]] и [[:>:]] для поиска границ слов в MySQL.(В других регулярных выражениях это будет \b, PERL, grep и т. Д.)

ОК, ПОПРОБУЙТЕ ЭТО ...

Это основано на функции выше, но жестко запрограммировано для поиска отдельных символов.Я не утверждаю, что это гораздо больше, чем взломать.Но если вам нужно выполнить работу, и вы не можете установить внешние библиотеки по какой-либо причине, это не замедлит работу со строками, которые НЕ имеют каких-либо одиночных символов для замены:

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//
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...