我有具有多于20列几个表,我必须除去端非alaphanumeric字符和所有列的起始
- 修剪第一
- 删除所有非字母数字字符和非符号“)”在每一列
- 的端部从各列的第一位置中删除所有的非字母数字字符和符号的非“(”
如果它是从整个字符串我可以简单地使用替代方法具d,但在我的情况下,只有在第一个位置和从最后一个位置。所以现在我正在使用子字符串,检查特殊字符并用空格替换。我觉得这是一种手动清洁,我相信这不是一个优雅的。
任何快速方法(查询),可以帮助我清理数据?
我有具有多于20列几个表,我必须除去端非alaphanumeric字符和所有列的起始
如果它是从整个字符串我可以简单地使用替代方法具d,但在我的情况下,只有在第一个位置和从最后一个位置。所以现在我正在使用子字符串,检查特殊字符并用空格替换。我觉得这是一种手动清洁,我相信这不是一个优雅的。
任何快速方法(查询),可以帮助我清理数据?
数据库是否必须为此在线?面对这个问题,我会考虑将数据转储到文件中,以便用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语句,而不是每列,但这有点花哨。
很明显,你将需要运行任何将要进行如此广泛的更新前的数据库备份...
是偶然中的数据在各种情况下具有相同的长度?这些不需要的字符*总是存在吗? – JYelton 2011-12-15 21:56:35
谢谢JYelton,我很抱歉我也应该写这个。不,它们并不总是存在,并且数据长度也不相同。 – Bujji 2011-12-15 22:15:52