我正在编写一个比较字符串的例程,但为了提高效率,我需要删除除字母或数字之外的所有字符。
我现在使用了多个REPLACE
函数,但也许有更快更好的解决方案?
发布于 2014-04-07 12:24:32
使用MySQL 8.0或更高版本
感谢Michal.jakubeczy的回答,现在MySQL支持Regex:
UPDATE {table} SET {column} = REGEXP_REPLACE({column}, '[^0-9a-zA-Z ]', '')
使用MySQL 5.7或更低版本
这里不支持正则表达式。我不得不创建我自己的函数alphanum,它为我剥离了字符:
DROP FUNCTION IF EXISTS alphanum;
DELIMITER |
CREATE FUNCTION alphanum( str CHAR(255) ) RETURNS CHAR(255) DETERMINISTIC
BEGIN
DECLARE i, len SMALLINT DEFAULT 1;
DECLARE ret CHAR(255) DEFAULT '';
DECLARE c CHAR(1);
IF str IS NOT NULL THEN
SET len = CHAR_LENGTH( str );
REPEAT
BEGIN
SET c = MID( str, i, 1 );
IF c REGEXP '[[:alnum:]]' THEN
SET ret=CONCAT(ret,c);
END IF;
SET i = i + 1;
END;
UNTIL i > len END REPEAT;
ELSE
SET ret='';
END IF;
RETURN ret;
END |
DELIMITER ;
现在我可以这样做了:
select 'This works finally!', alphanum('This works finally!');
我得到了:
+---------------------+---------------------------------+
| This works finally! | alphanum('This works finally!') |
+---------------------+---------------------------------+
| This works finally! | Thisworksfinally |
+---------------------+---------------------------------+
1 row in set (0.00 sec)
万岁!
发布于 2011-08-04 22:39:09
从性能的角度来看,(并且假设你读的比写的多)
我认为最好的方法是预先计算并存储列的剥离版本,这样可以减少转换。
然后,您可以在新列上建立索引,并让数据库为您完成这项工作。
发布于 2019-10-08 15:27:03
从MySQL 8.0开始,您可以使用正则表达式从字符串中删除非字母数字字符。有一个REGEXP_REPLACE方法
以下是删除非字母数字字符的代码:
UPDATE {table} SET {column} = REGEXP_REPLACE({column}, '[^0-9a-zA-Z ]', '')
https://stackoverflow.com/questions/6942973
复制相似问题