Mysql中Regexp常見用法
模糊匹配,包含特定字符串
# 查找content字段中包含“車友俱樂部”的記錄
select * from club_content where content regexp '車友俱樂部'
# 此時的regexp與like的以下用法是等同的
select * from club_content where content like '%車友俱樂部%'
模糊匹配,以特定字符串開頭
# 查找content字段中以“車友”開頭的記錄
select * from club_content where content regexp '^車友'
# 此時的regexp與like的以下用法是等同的
select * from club_content where content like '車友%'
模糊匹配,以特定字符串結尾
# 查找content字段中以“車友”結尾的記錄
select * from club_content where content regexp '車友$'
# 此時的regexp與like的以下用法是等同的
select * from club_content where content like '%車友'
模糊匹配,或關系
# 查找content字段中包含“心得”、“分享”或“技術貼”
select * from club_content where content REGEXP '心得|分享|技術貼'
模糊匹配,不包含單個字符
# 查找content字段中不包含“車”字、“友”字的記錄
select * from club_content where content REGEXP [^車友]
這個結果跑出來一看大吃一驚,竟然把所有記錄給跑出來,這是為什么呢?
因為一旦加了這個方括號"[]",它就把里面的內容拆成單個的字符再匹配,它會逐個字符去匹配判斷是不是等於“車”,或者是不是等於“友“,返回的結果是一組0、1的邏輯值。
如果想匹配不包含特定字符串,該怎么實現呢?
模糊匹配,不包含特定字符串
# 查找content字段不包含“車友”字符串的記錄
select * from club_content where content not REGEXP '車友'
MySql REGEXP運算符匹配字符串
1 ^ 匹配以該字符后面的字符開頭的字符串
舉個例子: REGEXP ‘^x' 表示匹配以x開頭的字符
2 $匹配以該字符前面的字符結尾的字符串
舉個例子: REGEXP ‘y$' 表示匹配以y結尾的字符
3 .匹配任意一個字符
4 […]匹配在方括號中的任意一個字符。
如: [1-9] 匹配1到9的數字, [abc]匹配其中任意一個
5 *匹配零個或多個在它前面的字符
如: x* 匹配任何數量的x字符
mysql 如何判斷 "字符串" 是否為 "數字"
這個問題有點怪 ,但很多時候我們會以字符串的形式存儲數字 , 反過來我們用字符串進行數學運算時, 好像也不會出錯 . 除非 , 用作數學運算的字符串不能轉換成數字 .
但是我們改如何判斷字符串是否能轉換成數字呢 ?
采用mysql的 REGEXP運算符 . 怎么用?
{String} REGEXP '[^0-9.]'
前面的字符串是我們要做判斷的, 后面的字符串是mysql的正則表達式,意思是 匹配不是數字或者小數點的字符。
如果String中含有不是0-9之間的數字或者是小數點時,返回true ,反之則返回false。
比如說 :
select ('123a' REGEXP '[^0-9.]'); --‘123a'中含有字符'a' 輸出結果為1 mysql中常量true輸出為1 false輸出為0
注意:如果字符串中有空格,也會匹配到正則表達式,返回1。如果是要去掉兩端的空格,就要將判斷的字符串,就要對字符串使用 trim()函數了。
這個只是REGEXP操作符的簡單應用,REGEXP的詳細應用請參考官方文檔。
MySQL 正則表達式
在前面的章節我們已經了解到MySQL可以通過 LIKE ...% 來進行模糊匹配。
MySQL 同樣也支持其他正則表達式的匹配, MySQL中使用 REGEXP 操作符來進行正則表達式匹配。
如果您了解PHP或Perl,那么操作起來就非常簡單,因為MySQL的正則表達式匹配與這些腳本的類似。
下表中的正則模式可應用於 REGEXP 操作符中。
實例
了解以上的正則需求后,我們就可以根據自己的需求來編寫帶有正則表達式的SQL語句。以下我們將列出幾個小實例(表名:person_tbl )來加深我們的理解:
查找name字段中以'st'為開頭的所有數據:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';
查找name字段中以'ok'為結尾的所有數據:
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
查找name字段中包含'mar'字符串的所有數據:
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';
查找name字段中以元音字符開頭或以'ok'字符串結尾的所有數據:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';