如何在mysql查询中使用Regexp?

时间:2015-02-20 05:22:53

标签: php mysql regex

我有一个像以下

的mysql表
jobno | duration
----------------
1     |  1 hr
2     |  3 hrs
3     |  1 hr 30 mins
4     |  2 hrs 15 mins
5     |  1 hr 15 min
6     |  45 mins
7     |  30 min

是否可以选择持续时间少于2小时的作业? 在谷歌花了很多时间后我发现mysql中有regexp功能。但这适用于这种情况吗? 我是mysql的新手。请帮助我们。

5 个答案:

答案 0 :(得分:2)

select * from TableName where duration NOT REGEXP '^([^1]|[1-9][0-9]+) hr.*'

试试这个。这样可行。See here

如果小于3,您可以使用

select * from TableName where duration  REGEXP '^([1-2] hr|[0-9]+ min).*'

http://www.sqlfiddle.com/#!2/ba4de/12/0

同样适用于4使用[1-3]等等。

答案 1 :(得分:1)

查看您的duration列格式。为什么你不能使用like

select * from yourTableName where duration like '1 hr%' or duration NOT like '%hr%';

或者如果您正在寻找4 hours以下的灵活性,请尝试以下方法:

select * from yourTableName
where duration REGEXP '^[1-3].*$' or duration not like "%hr%";

答案 2 :(得分:0)

您可以尝试此操作(不使用REGEX):

select * from TableName
where (duration not like '%hr%')
      OR (duration like '1 hr%')

结果:

JOBNO   DURATION
1       1 hr
3       1 hr 30 mins
5       1 hr 15 min
6       45 mins
7       30 min

SQL Fiddle中的示例结果。

<强>解释

WHERE子句中的第一个条件将获取持续时间不包含单词&#39; hr&#39; (这只是会议纪要)。第二个条件是从1 hr开始获取持续时间,这将是1小时-2小时之间的持续时间。

修改

为了使其更加灵活,您可以这样做:

select * from TableName
where (duration not like '%hr%')
      OR (CAST(SUBSTRING(duration,1,2) AS UNSIGNED) < 4)

结果:

JOBNO   DURATION
1       1 hr
2       3 hrs
3       1 hr 30 mins
4       2 hrs 15 mins
5       1 hr 15 min
6       45 mins
7       30 min

SQL Fiddle中的示例结果。

答案 3 :(得分:0)

不要尝试在SQL中解决问题,语言不够丰富。相反,使用Perl或PHP或某种具有良好REGEXP库的语言。

  1. 添加新列。

  2. 获取行,用您的应用程序语言转换它们,然后更新新列。

  3. 删除现有列 - 或保留它以供人类阅读。

答案 4 :(得分:0)

是的,可能。这将是痛苦的,并且在这里真正过度设计解决方案。

数据库的一般用途是加快访问速度,一般来说,正则表达式很昂贵。这里的另一个问题是可能没有关于如何存储这些时间字符串的承诺。在您给出的示例中,您需要解析数字值以确定接下来是否应该“hr”或“hrs”。

我建议改为以秒为单位存储持续时间(作为MySQL INT)。然后,您可以快速轻松地搜索INT

jobno | duration
-------------------
1     |  3600
2     |  10800
3     |  5400
4     |  8100
5     |  4500
6     |  2700
7     |  1800

“不到两小时”的查询将如下所示:

SELECT `jobno` FROM `jobs` WHERE `duration` < 7200;