我有一个像以下
的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的新手。请帮助我们。
答案 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库的语言。
添加新列。
获取行,用您的应用程序语言转换它们,然后更新新列。
删除现有列 - 或保留它以供人类阅读。
答案 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;