MySQL學習筆記:利用正則表達式實現多個字段模糊查詢


在 Oracle 中實現了多字段模糊匹配后,MySQL 也學習一番。找到一篇文章,記錄一番,不一一嘗試。


現在有這么一個需求:一個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';

一步到位。

正則表達式

  • ^ -- 匹配字符串的開始位置
  • $ -- 匹配字符串的結尾位置
  • . -- 任何單個字符
  • [...] -- 字符集合
  • [^...] -- 匹配未包含的任意字符
  • p1|p2|p3 -- 字符 或
  • 星號(*) -- 0個或多個字符
  • 加號(+) -- 1個或多個字符
  • {n} -- n次
  • {n,m} -- 最小n次,最多m次

其他

SQL 默認是忽略大小寫的。

在 MySQL 中,正則模式使用 regexp 和 not regexp 操作符(或者 rlike 和 not rlike,它們是同義詞)。

where name regexp '[a-z]' -- 包含a到z某個字符的字符串
where name regexp '^n.....b$' -- 以n開頭b結尾,7個字符長度的字符串
where name rlike 'd*' -- 包含0個或多個d的字符串
where name rlike 'B{1}$' -- 以1個B結尾
where name rlike 'b|a' -- 包含b或者a字符

MySQL 的 like 語句中的通配符:百分號、下划線和escape

  • 百分號:表示任意1個或多個任意字符。可匹配任意類型和長度的字符。
  • 下划線:表示任意單個字符。匹配單個任意字符,它常用來限制表達式的字符長度語句(可以代表一個中文字符)。
  • escape:轉義字符,后面的 % 和 _ 不作為通配符。

參考鏈接:mysql正則表達式,實現多個字段匹配多個like模糊查詢


免責聲明!

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



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