MySQL: как удалить двойные или более пробелов из строки? - PullRequest
12 голосов
/ 04 августа 2011

Я не смог найти этот вопрос для MySQL, поэтому вот он:

Мне нужно обрезать все двойные или более пробелов в строке до одного пробела.

Например: "Быстрая коричневая лиса" должно быть : "Быстрая коричневая лиса"

Функция REPLACE (str, "", "") удаляет только двойные пробелы, но оставляет несколько пробелов, когда их больше ...

Ответы [ 12 ]

17 голосов
/ 12 апреля 2013

Самое короткое и, на удивление, самое быстрое решение:

CREATE FUNCTION clean_spaces(str VARCHAR(255)) RETURNS VARCHAR(255)
BEGIN
    while instr(str, '  ') > 0 do
        set str := replace(str, '  ', ' ');
    end while;
    return trim(str);
END
14 голосов
/ 13 августа 2012
DELIMITER //

DROP FUNCTION IF EXISTS DELETE_DOUBLE_SPACES//
CREATE FUNCTION DELETE_DOUBLE_SPACES ( title VARCHAR(250) )
RETURNS VARCHAR(250) DETERMINISTIC
BEGIN
    DECLARE result VARCHAR(250);
    SET result = REPLACE( title, '  ', ' ' );
    WHILE (result <> title) DO 
        SET title = result;
        SET result = REPLACE( title, '  ', ' ' );
    END WHILE;
    RETURN result;
END//
DELIMITER ;

SELECT DELETE_DOUBLE_SPACES('a    b');
11 голосов
/ 03 марта 2016

Я знаю, что этот вопрос помечен mysql, но если вам повезло использовать MariaDB, вы можете сделать это проще:

SELECT REGEXP_REPLACE(column, '[[:space:]]+', ' ');
10 голосов
/ 04 августа 2011

Это решение не очень элегантное, но у вас нет другого выбора:

UPDATE t1 set str = REPLACE( REPLACE( REPLACE( str, "  ", " " ), "  ", " " ), "  ", " " );
9 голосов
/ 26 сентября 2016
DELIMITER //
DROP FUNCTION IF EXISTS DELETE_DOUBLE_SPACES//
CREATE FUNCTION DELETE_DOUBLE_SPACES(str VARCHAR(255)) RETURNS VARCHAR(255)
BEGIN
 set str = trim(str);
 while instr(str, '  ') > 0 do
 set str = replace(str, '  ', ' ');
 end while;
 return str;
END//
DELIMITER ;

SELECT DELETE_DOUBLE_SPACES("    a      b     ");
4 голосов
/ 02 апреля 2019

Вот старый трюк, который не требует регулярных выражений или сложных функций.

Вы можете использовать функцию замены 3 раза следующим образом:

REPLACE('This is    my   long    string',' ','<>')

становится:

This<>is<><><><>my<><><>long<><><><>string

Затем вы заменяете все вхождения '> <' пустой строкой '', заключая ее в другую замену: </p>

REPLACE(
  REPLACE('This is    my   long    string',' ','<>'),
    '><',''
)

This<>is<>my<>long<>string

Затем, наконец, последняя замена заменяет '<>' обратно водин пробел

REPLACE(
  REPLACE(
    REPLACE('This is    my   long    string',
      ' ','<>'),
    '><',''),
  '<>',' ')

This is my long string

Этот пример был создан в MYSQL (поместите SELECT впереди), но работает на многих языках.

3 голосов
/ 21 сентября 2011

После поиска я заканчиваю тем, что пишу функцию, т.е.

удаляем функцию, если существует trim_spaces;

delimiter $$

CREATE DEFINER=`root`@`localhost` FUNCTION `trim_spaces`(`dirty_string` text, `trimChar` varchar(1))
    RETURNS text
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
  declare cnt,len int(11) ;
  declare clean_string text;
  declare chr,lst varchar(1);

  set len=length(dirty_string);
  set cnt=1;  
  set clean_string='';

 while cnt <= len do
      set  chr=right(left(dirty_string,cnt),1);           

      if  chr <> trimChar OR (chr=trimChar AND lst <> trimChar ) then  
          set  clean_string =concat(clean_string,chr);
      set  lst=chr;     
     end if;

     set cnt=cnt+1;  
  end while;

  return clean_string;
END
$$
delimiter ;

ИСПОЛЬЗОВАНИЕ:

set @str='------apple--------banana-------------orange---' ;

select trim_spaces( @str,'-')

выход: apple-banana-orange-

параметр trimCharфункционировать может любой повторяющийся символ, который вы хотите удалить.

Обратите внимание, что первый набор символов будет повторяться

cheers:)

1 голос
/ 04 апреля 2017

Если вы используете php ....

try{
$con = new PDO ("mysql:host=localhost;dbname=dbasename","root","");
}
catch(PDOException $e){
echo "error".$e-getMessage();   
}

$select = $con->prepare("SELECT * FROM table");
$select->setFetchMode(PDO::FETCH_ASSOC);
$select->execute();

while($data=$select->fetch()){ 

$id = $data['id'];
$column = $data['column'];

$column = trim(preg_replace('/\s+/',' ', $column)); // remove all extra space


$update = $con->prepare("UPDATE table SET column=:column WHERE id='$id'");
$update->bindParam(':column', $column );
$update->execute();

// echo $column."<br>";
} 
0 голосов
/ 17 октября 2018

Если вы хотите обновить существующий столбец с несколькими пробелами в один, этот запрос обновления будет полезен:

ОБНОВЛЕНИЕ your_table SET column_that_you_want_to_change = REGEXP_REPLACE (column_that_you_want_to_change, '[[: space:]] +', '');

0 голосов
/ 14 октября 2018

Следуйте моей общей функции, созданной для MySQL 5.6.Мое намерение состояло в том, чтобы использовать регулярное выражение для идентификации пробелов, CR и LF, однако, эта версия mysql не поддерживается.Итак, мне пришлось перебирать строку в поисках символов.

CREATE DEFINER=`db_xpto`@`%` FUNCTION `trim_spaces_and_crlf_entire_string`(`StringSuja` text) RETURNS text CHARSET utf8     COLLATE utf8_unicode_ci
DETERMINISTIC
BEGIN
DECLARE StringLimpa TEXT;
DECLARE CaracterAtual, CaracterAnterior TEXT;
DECLARE Contador, TamanhoStringSuja INT;

SET StringLimpa = '';
SET CaracterAtual = '';
SET CaracterAnterior = '';
SET TamanhoStringSuja = LENGTH(StringSuja);
SET Contador = 1;

WHILE Contador <= TamanhoStringSuja DO
    SET CaracterAtual = SUBSTRING(StringSuja, Contador, 1);

    IF ( CaracterAtual = ' ' AND CaracterAnterior = ' ' ) OR CaracterAtual = '\n' OR CaracterAtual = '\r' THEN
        /* DO NOTHING */
        SET Contador = Contador;
        /* TORNA OS ESPAÇOS DUPLICADOS, CR, LF VISUALIZÁVEIS NO RESULTADO (DEBUG)
        IF ( CaracterAtual = ' ' ) THEN SET StringLimpa = CONCAT(StringLimpa, '*');END IF;
        IF ( CaracterAtual = '\n' ) THEN SET StringLimpa = CONCAT(StringLimpa, '\\N');END IF;
        IF ( CaracterAtual = '\r' ) THEN SET StringLimpa = CONCAT(StringLimpa, '\\R');END IF;
        */
    ELSE
        /* COPIA CARACTER ATUAL PARA A STRING A FIM DE RECONSTRUÍ-LA SEM OS ESPAÇOS DUPLICADOS */
        SET StringLimpa = CONCAT(StringLimpa, CaracterAtual);
        /*SET StringLimpa = CONCAT(StringLimpa, Contador, CaracterAtual);*/
        SET CaracterAnterior = CaracterAtual;
    END IF;

    SET Contador = Contador + 1;
END WHILE;

RETURN StringLimpa;
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...