MySQL: как удалить два или более пробелов из строки?

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

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

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

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

Ответ 1

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     ");

Ответ 2

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');

Ответ 3

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

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

Ответ 4

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

UPDATE t1 set str = REPLACE( REPLACE( REPLACE( str, "  ", " " ), "  ", " " ), "  ", " " );

Ответ 5

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

SELECT REGEXP_REPLACE(column, '[[:space:]]+', ' ');

Ответ 6

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

функция drop, если существует 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:)

Ответ 7

Если вы используете 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>";
} 

Ответ 8

Это немного общее решение: от

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=56195&whichpage=1

create table t (s sysname)
insert into t select 'The   Quick  Brown    Fox'
-- convert tabs to spaces
update  t set s = replace(s, '  ',' ')
where   charindex(' ', s) > 0

-- now do the work.
while 1=1
begin
    update t
    set     s = substring(s, 1, charindex('  ', s, 1)-1) + ' ' + ltrim(substring(s,charindex('  ', s, 1), 8000))
    where   charindex('  ', s, 1) > 0

    if @@rowcount = 0
        break
end

select  s
from    t

Ответ 9

Если строка, которую вы хотите преобразовать, состоит только из алфавитов и нескольких пробелов [A-Za-z] *, тогда будет работать следующая функция. Я обнаружил шаблон, когда такие строки преобразуются в hex. Исходя из этого, мое решение следует. Не очень элегантный, но он не требует никаких процедур.

unhex(
replace(
replace(
replace(
replace(
replace(
replace(
hex(str)
,204,1014)
,205,1015)
,206,1016)
,207,1017)
,20,'')
,101,20)
)