将除一组字符之外的所有字符转换为MySQL中的空白

时间:2014-09-11 03:43:00

标签: mysql regex

我有一组定义为有效字符的字符。让我通过以下正则表达式定义有效字符串:

  

^ [a-zA-Z0-9 \ .- _] + $

(字母数字,空格,点,短划线和下划线)

问题是,如果给定一个包含大量无效字符的列,我如何运行更新以将每个无效字符转换为一个空格?然后可能将后续空间转换为一个空格?

我无法运行多个替换命令,因为有很多可能的无效字符。所以我期待一个正则表达式解决方案。

目前,我正在用Java完成任务(在将表导出为tsv格式之后)。但我想要一种MySQL方法。

1 个答案:

答案 0 :(得分:1)

如果你的MySQL版本支持它,create a function

DELIMITER $$
CREATE FUNCTION my_func_1 (str TEXT)
  RETURNS TEXT
BEGIN
  DECLARE ret TEXT DEFAULT '';
  DECLARE chr TEXT DEFAULT '';
  DECLARE i INT DEFAULT 1;
  WHILE i < (LENGTH(str) + 1) DO
    SET chr = SUBSTRING(str, i, 1);
    IF chr REGEXP '[-a-zA-Z0-9\\_.]'
      THEN SET ret = CONCAT(ret, chr);
    ELSE
      SET ret = CONCAT(ret, ' ');
    END IF;
    SET i = i + 1;
  END WHILE;
  WHILE ret LIKE '%  %' DO
    SET ret = REPLACE(ret, '  ', ' ');
  END WHILE;
  RETURN TRIM(ret);
END;
$$
DELIMITER ;

稍微测试一下:

SELECT my_func_1('$a-B\\?!=01._%');&gt; a-B\ 01._

并使用SET col = my_func_1(col)

进行更新

如果不再需要:

DROP FUNCTION IF EXISTS my_func_1;

我还改变了你的正则表达式,因为-表示一个范围,如果在一个类中的字符之间或者.-_意图?然后修改模式。