• 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模糊查询

  • 相关阅读:
    28335外部中断的简单介绍和配置
    C++中强制类型转换
    GitHub上Markdown语法的高级应用
    C++中强制类型转换
    模拟鼠标点击事件
    clone一行div tr 每次增量赋值
    linux tomcat自动部署shell
    maven 引用本地jar
    JDK自带工具keytool生成ssl证书
    jenkins+maven+svn实现简单的一键发布
  • 原文地址:https://www.cnblogs.com/hider/p/12096487.html
Copyright © 2020-2023  润新知