mysql like 多列_mysql正则表达式,实现多个字段匹配多个like模糊查询

本文介绍了如何优化SQL查询,从最初的不包含特定文件格式的条件判断,逐步演进到使用CONCAT函数和正则表达式进行优化。通过示例展示了正则表达式的使用,包括匹配特定字符、字段起始和结尾等,并提供了MySQL中LIKE和REGEXP的对比,帮助理解其在模糊查询中的应用。同时,讨论了LIKE语句中的通配符%,_及其ESCAPE功能。
摘要由CSDN通过智能技术生成

现在有这么一个需求

一个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,一步到位。。。

再总结一下常用的正在表达式。

d8d0d15d18879da4b48d3ad90b9f508c.png

这名字很是调皮,在此基础上再做修改

-- ==============正则查询================

/*

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

作者:陈灬大灬海

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值