[英]How to use Regexp in mysql queries?
我有一個像以下一樣的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的新手。 請幫助我們。
select * from TableName where duration NOT REGEXP '^([^1]|[1-9][0-9]+) hr.*'
試試這個。這樣可行。 看這里
少於3
你可以使用
select * from TableName where duration REGEXP '^([1-2] hr|[0-9]+ min).*'
http://www.sqlfiddle.com/#!2/ba4de/12/0
同樣適用於4
[1-3]
等。
查看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%";
你可以嘗試這個(不使用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
子句中的第一個條件將獲取持續時間不包含單詞'hr'(僅為分鍾數)的記錄。 第二個條件是從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中的示例結果。
不要試圖在SQL中解決問題,語言不夠豐富。 相反,使用Perl或PHP或某些具有良好REGEXP庫的語言。
添加新列。
獲取行,使用應用程序語言轉換它們,然后更新新列。
刪除現有列 - 或保留它以供人類閱讀。
應該是。 這將是痛苦的,並且在這里真正過度設計解決方案。
數據庫的一般目的是加快訪問速度,一般來說,正則表達式很昂貴。 這里的另一個問題是可能沒有關於如何存儲這些時間字符串的承諾。 在您給出的示例中,您需要解析數字值以確定接下來是否應該“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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.