1. 程式人生 > >mysql正則表示式,實現多個欄位匹配多個like模糊查詢

mysql正則表示式,實現多個欄位匹配多個like模糊查詢

現在有這麼一個需求

一個questions表,欄位有題目(TestSubject),選項(AnswerA,AnswerB,AnswerC,AnswerD,AnswerE) 要求欄位不包含png,jpg,jpeg,gif 

正常情況下會這麼寫

select * from questions where TestSubject not like '%png%' or TestSubject  not like '%png%' or ...... 

總共需要寫6 * 4 = 24個。

第一步優化,將欄位拼接起來當做一個欄位

select * from questions where
concat(TestSubject,AnswerA,AnswerB,AnswerC,AnswerD,AnswerE) not like '%png%' or concat(TestSubject,AnswerA,AnswerB,AnswerC,AnswerD,AnswerE) not like '%jpg%' ......

總共需要重複寫四遍

第二步優化,使用正則表示式。具體語法檢視regexp語法 菜鳥教程

select * from questions where concat(TestSubject,AnswerA,AnswerB,AnswerC,AnswerD,AnswerE) NOT
REGEXP 'png|jpg|jpeg|gif'

ok,一步到位。。。

 

再總結一下常用的正在表示式。

 

一下參考 風吹屁股涼冰冰 

這名字很是調皮,在此基礎上再做修改

-- ==============正則查詢================
/*
SQL預設是忽略大小寫的
正則模式使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它們是同義詞)。正則即欄位值包含正則的內容即可
.      匹配任何單個的字元,表示任意單字元
[...]  匹配包含方括號內某單個字元的字串,[0-9]匹配0到9之間的某個數字
*      匹配零個或多個在它前面的字元
{n}    匹配n個在它前面的字元

如果希望大小寫都匹配上可以這樣寫。[aA] 匹配大小寫的 a,[a-zA-Z] 則匹配大小寫的任何 a-z 單個字母。
但預設是不區分大小寫的 [b] 也可匹配上還有 B 的字串
要匹配的字元在欄位起始處,使用 ^ ,在欄位的結尾用 $
如果是中文字元,可能在使用時需要注意一下。

*/ -- 欄位name只有四個值,name_aA ,name_aB , name_人人 ,name_%好好_ SELECT * FROM `test_t` WHERE NAME REGEXP '[a-z]'; -- 包含a到z某個字元的字串,能匹配到 name_aA 和 name_aB 和 name_人人 和 name_%好好_ SELECT * FROM `test_t` WHERE NAME REGEXP '^n.....b$'; -- 以n開頭B結尾,7個字元長度的字串,能匹配到 name_aB SELECT * FROM `test_t` WHERE NAME RLIKE 'd*'; -- 包含0個或多個d的字串,能匹配到該欄位的所有值,因為 * 前的字元0個也匹配 SELECT * FROM `test_t` WHERE NAME RLIKE 'B{1}$'; -- 結尾是一個B,能匹配到name_aB -- ==============模糊查詢================ -- MySql的like語句中的萬用字元:百分號、下劃線和escape -- % 表示任意個或多個任意字元。可匹配任意型別和長度的字元。 SELECT * FROM `test_t` WHERE NAME LIKE '%me_aB'; -- 查詢結果 name_aB -- 如果需要找出 name 中既有 b 又有 a 的記錄,使用 and 條件 SELECT * FROM `test_t` WHERE NAME LIKE '%b%' AND NAME LIKE '%a%'; -- 若使用 SELECT * FROM `test_t` WHERE NAME LIKE '%b%a%'; 則找不到 name_aB。。。當然也可以使用正則where regexp 'b|a' -- _ 表示任意單個字元。匹配單個任意字元,它常用來限制表示式的字元長度語句(可以代表一箇中文字元) SELECT * FROM `test_t` WHERE NAME LIKE '_______'; -- 能查詢到 name_aA 和 name_aB 還有 name_人人 這7個字元長度的值 -- 如果要查字元 % 或者 _ 使用 ESCAPE,轉義字元後面的 % 或 _ 就不作為萬用字元了,注意前面沒有轉義字元的%和_仍然起萬用字元作用 SELECT * FROM `test_t` WHERE NAME LIKE 'name_/%%好/_' ESCAPE '/'; -- 查詢結果 name_%好好_

 ok,nice