mysql - rlike 表达式或替代查询中的性能?

标签 mysql sql regex date

从制表符分隔值中导入某些表后,我正在对它们进行一系列更新。数据带有我不喜欢的格式的日期。我将它们作为字符串引入,对其进行操作,使它们与 MySQL 日期的格式相同,然后转换该列。或者有时不是,但我希望它们像 MySQL 日期一样,即使它们是字符串。

它们以“1/4/2013 12:00:00 AM”或“11/4/2012 2:37:45 PM”开头。

我将它们变成“2013-01-04”(通常,因为即使原始模式仅明确指定日期,时间也会存在)和“2012-11-04 14:37:45”。

我正在使用 rlike。这不使用索引?哇。太糟糕了。

但是,对于每一列,我必须使用 4 次更新来处理不同的情况(“1/7”、“2/13”、“11/2”、“12/24”)。如果我使用 like 来做这些,每列可能需要 16 次不同的更新....

而且,如果我没看错的话,我什至无法从 rlike 表达式中获取位置参数,是吗?你知道,括号中的表达式部分变为 $1 或 $2....

因此,似乎用 perl 预处理 tsv 文件会更快。真的吗?哇。同样,这很糟糕。

还有其他建议吗?每次我需要提取数据时,我不能让这花费 3 个小时。

最佳答案

回想一下 Jamie Zawinski 1997 年的经典名言:

Some people, when confronted with a problem, think "I know, I'll use regular expressions."
Now they have two problems.

您是否尝试过使用 STR_TO_DATE() ?这正是用于将非标准日期/时间字符串解析为规范的日期时间值。

如果您尝试使用 STR_TO_DATE() 进行解析并且字符串与预期格式不匹配,则该函数返回 NULL。

因此您可以尝试以不同的格式进行解析,并返回第一个给出非空结果的格式。

UPDATE mytable
SET datecolumn = COALESCE(
    STR_TO_DATE(stringcolumn, '%m/%d'),
    STR_TO_DATE(stringcolumn, '%d/%m/%Y'),
    ...etc.
);

我不知道你的不同情况是什么。可能会也可能不会一次涵盖所有情况。

如您所说,另一种选择是在将原始数据加载到 MySQL 之前使用 Perl 对其进行预处理。但即便如此,也不要与正则表达式作对,使用 Date::Parse相反。

关于mysql - rlike 表达式或替代查询中的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21743084/

相关文章:

sql - 我可以在 mysql 4.0.27 中使用 contains 函数吗?

regex - 尝试使用 regexp_matches() 编写一个 SQL 查询,在 postgresql 中看起来是正向的

regex - 使用 Ansible 从页面中提取过滤后的链接

php - float 编号与应有的不一样

mysql - 日期时间 DATE DIFF 未按预期工作

python - 用Python高效存储和访问网页

mySQL 5.7 使用新的 json 功能将行作为 json 返回

sql - Hive 游标实现替代方案

phpMyAdmin MySQL 时间戳显示尾随零

regex - 我需要使用 sed 转义哪些字符才能使此正则表达式正常工作