rlike表达式或备用查询中的性能?

时间:2014-02-13 00:44:25

标签: 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个小时。

1 个答案:

答案 0 :(得分:1)

回想一下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。

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

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

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

另一种选择就像你说的那样,在将原始数据加载到MySQL之前用Perl预处理原始数据。但即使这样,也不要使用正则表达式,而是使用Date::Parse