2011-12-15 15 views
3

我有具有多于20列几个表,我必须除去端非alaphanumeric字符和所有列的起始

  1. 修剪第一
  2. 删除所有非字母数字字符和非符号“)”在每一列
  3. 的端部从各列的第一位置中删除所有的非字母数字字符和符号的非“(”

如果它是从整个字符串我可以简单地使用替代方法具d,但在我的情况下,只有在第一个位置和从最后一个位置。所以现在我正在使用子字符串,检查特殊字符并用空格替换。我觉得这是一种手动清洁,我相信这不是一个优雅的。

任何快速方法(查询),可以帮助我清理数据?

+0

是偶然中的数据在各种情况下具有相同的长度?这些不需要的字符*总是存在吗? – JYelton 2011-12-15 21:56:35

+0

谢谢JYelton,我很抱歉我也应该写这个。不,它们并不总是存在,并且数据长度也不相同。 – Bujji 2011-12-15 22:15:52

回答

1

数据库是否必须为此在线?面对这个问题,我会考虑将数据转储到文件中,以便用perl,awk或其他适合文本处理的工具以这种方式进行处理。

如果这是不可能的,另一种选择是,以构建接收VARCHAR一个FUNCTION内的改写(munging)算法,并返回清理字符串作为VARCHAR(NB未测试的代码,仅说明性的):

CREATE FUNCTION cleanup(instr VARCHAR(255)) RETURNS VARCHAR(255)); 
    DECLARE outstr VARCHAR(255); 
    SET outstr = TRIM(instr); 
    IF NOT (outstr REGEXP '^[[:alnum:][.left-parenthesis.]]'); 
     SET outstr = SUBSTRING(outstr,2); 
    END IF; 
    WHILE NOT (outstr REGEXP '[[:alnum:][.right-parenthesis.]]$' DO 
     SET outstr = LEFT(outstr, LENGTH(outstr)-1); 
    END WHILE; 
    SELECT outstr; 
END FUNCTION; 

然后,您可以编写一个读取系统目录的查询,即information_schema.columns并生成所需的UPDATE语句。沿(未经测试)线的东西:

SELECT CONCAT_WS(" ", "UPDATE", table_name, 
       "SET", column_name, " = cleanup(", column_name, ")") 
    FROM information_schema.columns 
    WHERE table_schema = "your-database" AND collation_name IS NOT NULL 

保存的,输出,检查它,并运行它。

collation_name过滤器应确保我们将其限制为仅限文本类型的字段。再次,这是未经测试的,但应该给你一般的想法。你甚至可以使用GROUP_CONCAT来构建一个这样的版本,每个表创建一个单独的SQL语句,而不是每列,但这有点花哨。

很明显,你将需要运行任何将要进行如此广泛的更新前的数据库备份...

相关问题