我找不到MySQL的这个问题,所以这里是:
我需要将字符串中的所有双倍或更多空格修剪为1个单独空格.
例如:"快速布朗狐狸"应该是:"快速布朗狐狸"
函数REPLACE(str,"","")只删除双空格,但是当有更多空格时会留下多个空格...
最短,最令人惊讶的最快解决方案:
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
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');
我知道这个问题用mysql标记,但如果你有幸使用MariaDB,你可以更容易地做到这一点:
SELECT REGEXP_REPLACE(column, '[[:space:]]+', ' ');
这个解决方案不是很优雅,但因为你没有任何其他选择:
UPDATE t1 set str = REPLACE( REPLACE( REPLACE( str, " ", " " ), " ", " " ), " ", " " );
这是一个古老的技巧,不需要正则表达式或复杂的函数。
您可以使用替换功能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),但是可以使用多种语言。