我找不到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
Арт*_*цын 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');
tom*_*ors 12
我知道这个问题用mysql标记,但如果你有幸使用MariaDB,你可以更容易地做到这一点:
SELECT REGEXP_REPLACE(column, '[[:space:]]+', ' ');
nob*_*ody 10
这个解决方案不是很优雅,但因为你没有任何其他选择:
UPDATE t1 set str = REPLACE( REPLACE( REPLACE( str, "  ", " " ), "  ", " " ), "  ", " " );
小智 6
对于 MySQL 8+,您可以使用REGEXP_REPLACE函数:
UPDATE `your_table` 
SET `col_to_change`= REGEXP_REPLACE(col_to_change, '[[:space:]]+', ' ');
小智 6
这是一个古老的技巧,不需要正则表达式或复杂的函数。
您可以使用替换功能3次,如下所示:
REPLACE('This is    my   long    string',' ','<>')
变成:
This<>is<><><><>my<><><>long<><><><>string
然后,将所有出现的'> <'用空字符串''替换,将其包装在另一个替换中:
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),但是可以使用多种语言。
搜索后我最终编写了一个函数,即
如果存在则删除函数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可以是任何重复且您想要删除的字符。
请注意,它将保留重复集中的第一个字符
干杯:)