Mysql中find_in_set()函数用法详解以及使用场景
作者:鹅中原锤王 发布时间:2024-01-18 10:17:47
一、find_in_set() 函数详解
示例:
select FIND_IN_SET('1', '1,2,3');
// 结果:1
select FIND_IN_SET('3', '1,2,3');
// 结果:3
select FIND_IN_SET('4', '1,2,3');
// 结果:0
// 后一个包含前一个返回大于0的元素所在位置,不包含前一个则返回0
相信大家看完以上示例就知道这个函数的大概作用了,以下是MySQL手册中官方说明
FIND_IN_SET(str,strlist),该函数的作用是查询字段(strlist)中是否包含(str)的结果,
返回结果为null或记录 。str 要查询的字符串
strlist 需查询的字段,参数以”,”分隔,例如如 '1,2,3'
假如字符串str在由N个子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。 一个字符串列表
就是一个由一些被’,‘ 符号分开的子链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,
则FIND_IN_SET() 函数被优化,使用比特计算。
如果str不在strlist 或strlist 为空字符串,则返回值为 0 。
如任意一个参数为NULL,则返回值为 NULL。
这个函数在第一个参数包含一个逗号( , )时将无法正常运行。
概括一下就是(前一个字符串是A,后一个字符串是B):
如果B字符串包含A字符串:则返回大于0的值,这个值就是A字符串在B字符串的所在位置;
如果B字符串不包含A字符串:则返回0;
如果B字符串或者A字符串有任意一个是null,则返回null;
如果A字符串包含逗号,则无法执行。
二、应用场景
就拿若依的权限认证的其中一条sql来给大家举例吧:
SELECT dept_id, parent_id, ancestors, order_num, leader, phone FROM sys_dept
WHERE dept_id = 101 or FIND_IN_SET(101, ancestors) ;
查询结果:
sql想要实现的功能就是查询部门id是101的,或者其他部门的ancestors字段(祖先)中有101的所有部门。使用FIND_IN_SET()函数完全可以实现。
那有的朋友就会说了,为什么不用in或者like呢,区别如下:
三、FIND_IN_SET()和IN、LIKE的区别:
1.IN和FIND_IN_SET的区别:
SELECT dept_id, parent_id, ancestors, order_num, leader, phone FROM sys_dept
WHERE '101' IN ('101,102') ;
in后面只能跟常量, 如果跟字符串的话,就会和字符串的值进行完全匹配,所以上面的sql查询不到记录。
但是find_in_set()函数可以使用常量或字段。
2.like和FIND_IN_SET的区别:
SELECT dept_id, parent_id, ancestors, order_num, leader, phone FROM sys_dept
WHERE ancestors LIKE '%10%' ;
SELECT dept_id, parent_id, ancestors, order_num, leader, phone FROM sys_dept
WHERE FIND_IN_SET(10, ancestors) ;
like是广泛的模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值会以英文”,”分隔,
Find_IN_SET查询的结果要小于like查询的结果。
来源:https://blog.csdn.net/Jiao1225/article/details/128376356
猜你喜欢
- 我们经常使用傅里叶变换来计算数字信号的频谱,进而分析数字信号,离散时间傅里叶变换的公式为:可是自己动手实现一遍才是最好的学习。在数字分析里面
- 本文将介绍8个简洁的Python技巧,若非经验十足的程序员,你肯定有些从未见过。向着更简洁更高效,出发吧!1.通过多个键值将对象进行排序 假
- 1. 场景描述一直做java,因项目原因,需要封装一些经典的算法到平台上去,就一边学习python,一边网上寻找经典算法代码,今天介绍下经典
- 1. js的数据类型1.1 js引入方式<!DOCTYPE html><html lang="en"&
- 一、出错情况 有些时候当你重启了数据库服务,会发现有些数据库变成了正在恢复、置疑、可疑等情况,这个时候DBA就会很紧张了,下面是一些在实践中
- 基本概念上一节提到,代码完成的标准之一还包含了单元测试,这部分也是很多开发流程中不规范的地方。写过单元测试的开发人员应该理解,单元测试最核心
- 用CSS+DIV编写的实现在网页中显示圆角矩形的代码!希望对大家有用!谢谢支持!以下为CSS代码:<style> div.bg{
- 本文实例讲述了CentOS环境下安装Redis3.0及phpredis扩展测试。分享给大家供大家参考,具体如下:线上的统一聊天及推送系统re
- 为什么程序员都喜欢黑php?如果php经常被人黑,反而是好事!世界上只有两种语言: 没人用的和经常被人喷的。不管你喷也好,黑也好,骂也好,都
- 一、页的概览我们往 MySQL 插入的数据最终都是存在页中的。在 InnoDB 中的设计中,页与页之间是通过一个双向链表连接起来。而存储在页
- Python 是一种美丽的语言,它简单易用却非常强大。但你真的会用 Python 的所有功能吗?任何编程语言的高级特征通常都是通过大量的使用
- Android客户端和PHP、MySQL搭建的服务器之间的简单交互,实现登录功能 。实现原理图:Handler消息机制原理:Handler机
- 如何在页面错误时向数据库中添加记录?在ASP中,我在页面中添加了On Error Resume Next错误命令,以消除和避免程序错误。现在
- 前言说到幻影坦克,我就想起红色警戒里的……幻影坦克(Mirage Tank),《红色警戒2》以及《尤里的复仇》中盟军的一款伪装坦克,盟军王牌
- 1.方法说明 , Array的reduce()把一个函数作用在这个Array的[x1, x2, x3...]上,这个函数必须接收两个参数,r
- 使用xlrd模块和xlwt模块解题思想:xlwt模块是非追加写.xls的模块,所以要借助for循环和列表,来一次性写入,这样就没有追加与非追
- 作为k8s官方维护的客户端,k8s go-client对于go语言中使用k8s可以说是唯一选项。但是官方的使用示例我个人觉得并不是很清晰,尤
- unplugin-auto-import的配置和eslint报错解决先上官网:unplugin-auto-importunplugin-au
- 在表中有两个字段:id_no (varchar) , in_date (datetime) ,把in_date相同的记录的in_date依次
- 一、概念介绍Thread 是threading模块中最重要的类之一,可以使用它来创建线程。有两种方式来创建线程:一种是通过继承Thread类