mysql正則表示式,實現多個欄位匹配多個like模糊查詢
阿新 • • 發佈:2018-12-21
現在有這麼一個需求
一個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 whereconcat(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) NOTREGEXP '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