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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM