MySQL:如何从字符串中删除两个或多个空格?

Dyl*_*lan 15 mysql string

我找不到MySQL的这个问题,所以这里是:

我需要将字符串中的所有双倍或更多空格修剪为1个单独空格.

例如:"快速布朗狐狸"应该是:"快速布朗狐狸"

函数REPLACE(str,"","")只删除双空格,但是当有更多空格时会留下多个空格...

小智 18

最短,最令人惊讶的最快解决方案:

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
Run Code Online (Sandbox Code Playgroud)


Арт*_*цын 17

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');
Run Code Online (Sandbox Code Playgroud)


tom*_*ors 12

我知道这个问题用mysql标记,但如果你有幸使用MariaDB,你可以更容易地做到这一点:

SELECT REGEXP_REPLACE(column, '[[:space:]]+', ' ');
Run Code Online (Sandbox Code Playgroud)


nob*_*ody 10

这个解决方案不是很优雅,但因为你没有任何其他选择:

UPDATE t1 set str = REPLACE( REPLACE( REPLACE( str, "  ", " " ), "  ", " " ), "  ", " " );
Run Code Online (Sandbox Code Playgroud)


小智 6

对于 MySQL 8+,您可以使用REGEXP_REPLACE函数:

UPDATE `your_table` 
SET `col_to_change`= REGEXP_REPLACE(col_to_change, '[[:space:]]+', ' ');
Run Code Online (Sandbox Code Playgroud)


小智 6

这是一个古老的技巧,不需要正则表达式或复杂的函数。

您可以使用替换功能3次,如下所示:

REPLACE('This is    my   long    string',' ','<>')
Run Code Online (Sandbox Code Playgroud)

变成:

This<>is<><><><>my<><><>long<><><><>string
Run Code Online (Sandbox Code Playgroud)

然后,将所有出现的'> <'用空字符串''替换,将其包装在另一个替换中:

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

This<>is<>my<>long<>string
Run Code Online (Sandbox Code Playgroud)

然后最后一个最后的替换将'<>'转换回单个空格

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

This is my long string
Run Code Online (Sandbox Code Playgroud)

本示例是使用MYSQL创建的(在前面放置了SELECT),但是可以使用多种语言。


sak*_*zai 5

搜索后我最终编写了一个函数,即

如果存在则删除函数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 ;
Run Code Online (Sandbox Code Playgroud)

用法:

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

select trim_spaces( @str,'-')

输出:apple-banana-orange-

函数的参数trimChar可以是任何重复且您想要删除的字符。

请注意,它将保留重复集中的第一个字符

干杯:)