mysql中find_in_set()函数的使用及in()用法详解

news2024/10/2 16:20:45

MySQL手册中find_in_set函数的语法解释:

FIND_IN_SET(str,strlist)

str 要查询的字符串
strlist 字段名 参数以”,”分隔 如 (1,2,6,8,10,22)
查询字段(strlist)中包含(str)的结果,返回结果为null或记录

假如字符串str在由N个子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。 一个字符串列表就是一个由一些被 ‘,’ 符号分开的子链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则FIND_IN_SET() 函数被优化,使用比特计算。 如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号(‘,')时将无法正常运行。

看不懂概念也没事,按下面类子:

  • 例子1:

SELECT FIND_IN_SET(‘b’, ‘a,b,c,d’);
结果:2

因为b 在strlist集合中放在2的位置 从1开始

select FIND_IN_SET(‘1’, ‘1’); 返回 就是1 这时候的strlist集合有点特殊 只有一个字符串 其实就是要求前一个字符串 一定要在后一个字符串集合中才返回大于0的数

select FIND_IN_SET(‘2’, ‘1,2’); 返回2 select FIND_IN_SET(‘6’, ‘1’);
返回0
strlist中不存在str,所以返回0。

find_in_set()和in的区别:

弄个测试表来说明两者的区别

CREATE TABLE tb_test (
id int(8) NOT NULL auto_increment,
name varchar(255) NOT NULL,
list varchar(255) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO tb_test VALUES (1, ‘name’, ‘daodao,xiaohu,xiaoqin’);
INSERT INTO tb_test VALUES (2, ‘name2’, ‘xiaohu,daodao,xiaoqin’);
INSERT INTO tb_test VALUES (3, ‘name3’, ‘xiaoqin,daodao,xiaohu’);

原来以为mysql可以进行这样的查询:

SELECT id,name,list from tb_test WHERE ‘daodao’ IN(list); – (一)

在这里插入图片描述
实际上这样是不行的, 这样只有当list字段的值等于’daodao’时(和IN前面的字符串完全匹配),查询才有效,否则都得不到结果,即使’daodao’真的在list中。

再来看看这个:

SELECT id,name,list from tb_test WHERE ‘daodao’ IN (‘libk’, ‘zyfon’, ‘daodao’); – (二)
在这里插入图片描述

这样是可以的。

这两条到底有什么区别呢?为什么第一条不能取得正确的结果,而第二条却能取得结果。原因其实是(一)中 (list) list是变量, 而(二)中 (‘libk’, ‘zyfon’, ‘daodao’)是常量。

所以如果要让(一)能正确工作,需要用

find_in_set():
SELECT id,name,list from tb_test WHERE FIND_IN_SET(‘daodao’,list); – (一)的改进版

在这里插入图片描述

总结:

所以如果list是常量,则可以直接用IN, 否则要用find_in_set()函数。

也就是这两个sql是查询的效果是相同的:

SELECT * from C_PURCHASINGMASTERDATA where FIND_IN_SET(EKGRP,‘C54,C02,C14,C60,C06,C61,C53,C51,C12,C08,C03,C07’)

SELECT * from C_PURCHASINGMASTERDATA where EKGRP in (‘C54’,‘C02’,‘C14’,‘C60’,‘C06’,‘C61’,‘C53’,‘C51’,‘C12’,‘C08’,‘C03’,‘C07’)

但是如果第二句sql里面的值是传入sql的一个变量字段,那么第二句sql就不好使了。要以实际情况决定用in还是用 find_in_set()函数 。

find_in_set()和like的区别:

主要的区别就是like是广泛的模糊查询,而 find_in_set() 是精确匹配,并且字段值之间用‘,'分开。

现在想查询拥有角色编号为2的用户,用like关键字查询:

SELECT userid,username,userrole 角色 FROM user WHERE userrole LIKE ‘%2%’;

结果:
在这里插入图片描述
用 find_in_set() 查询:

SELECT userid,username,userrole 角色 FROM user WHERE find_in_set(‘2’,userrole)

结果:
在这里插入图片描述
显然用 find_in_set() 查询得到的结果才是我们想要的结果。所以他俩的

主要的区别就是like是广泛的模糊查询;而 find_in_set() 是精确匹配,并且字段值之间用‘,'分开,Find_IN_SET查询的结果要小于like查询的结果。

mysql 中find_in_set()和in()用法比较

在mysql中in可以包括指定的数字,而find_in_set()用于特定的数据类型。

find_in_set 函数使用方法

个例子来说:

有个文章表里面有个type字段,它存储的是文章类型,有 1头条、2推荐、3热点、4图文…1,12,13 等等 。
现在有篇文章他既是 头条,又是热点,还是图文,
type中以 1,3,4 的格式存储。
那我们如何用sql查找所有type中有4图文标准的文章呢??
这就要我们的 find_in_set 出马的时候到了。
以下为引用的内容:

select * from article where FIND_IN_SET(‘4’,type)

MySQL手册中find_in_set函数的语法:

FIND_IN_SET(str,strlist)

假如字符串str 在由N 子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。
一个字符串列表就是一个由一些被 ‘,’ 符号分开的子链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则 FIND_IN_SET() 函数被优化,使用比特计算。
如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号(‘,')时将无法正常运行。

mysql> SELECT FIND_IN_SET(‘b’, ‘a,b,c,d’);

-> 2 因为b 在strlist集合中放在2的位置 从1开始

select FIND_IN_SET(‘1’, ‘1’); 返回 就是1 这时候的strlist集合有点特殊 只有一个字符串 其实就是要求前一个字符串 一定要在后一个字符串集合中 才返回 大于0的数

select FIND_IN_SET(‘2’, ‘1,2’); 返回2
select FIND_IN_SET(‘6’, ‘1’); 返回0

注意:

select * from treenodes where FIND_IN_SET(id, ‘1,2,3,4,5’);

使用find_in_set函数一次返回多条记录
id 是一个表的字段,然后每条记录分别是id等于1,2,3,4,5的时候
有点类似in (集合)

select * from treenodes where id in (1,2,3,4,5);

弄个测试表来说明两者的区别

CREATE TABLE test (
id int(8) NOT NULL auto_increment,
name varchar(255) NOT NULL,
list varchar(255) NOT NULL,
PRIMARY KEY (id)
)
INSERT INTO test VALUES (1, ‘name’, ‘daodao,www.jb51.net,xiaoqin’);
INSERT INTO test VALUES (2, ‘name2’, ‘xiaohu,daodao,xiaoqin’);
INSERT INTO test VALUES (3, ‘name3’, ‘xiaoqin,daodao,www.jb51.net’);

原来以为MySQL可以进行这样的查询:

select id, list, name from table where ‘daodao’ IN (list);

(一)
实际上这样是不行的,这样只有当name是list中的第一个元素时,查询才有效,否则都得不到结果,即使’daodao’真的在list中。
再来看看这个:

select id, list, name from table where ‘daodao’ IN (‘libk’, ‘zyfon’, ‘daodao’);

(二)这样是可以的。

这两条到底有什么区别呢?为什么第一条不能取得正确的结果,而第二条却能取得结果。
原因其实是(一)中 (list) list是变量, 而(二)中 (‘libk’, ‘zyfon’, ‘daodao’)是常量。
所以如果要让(一)能正确工作,需要用find_in_set():

select id, list, name from table where find_in_set(‘daodao’,list);

(一)的改进版。

总结:

所以如果list是常量,则可以直接用IN, 否则要用find_in_set()函数。

以上所述是小编给大家介绍的mysql中find_in_set()函数的使用详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/7423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux:rpm与yum(内含:1.rpm介绍+2.卸载rpm包+3.安装rpm(应用案例)+4.yum(应用案例))

1.rpm介绍使用: 实例:查看当前系统是否安装了 firefox ,操作如下: 解释: 名称:firefox 版本号:91.11.0-2 使用操作系统:el7.centos.x86_64 表示centos.x的64位系统。 查询软件包是否安装&#…

跨境电商卖家必知的9个圣诞节营销技巧

关键词:跨境电商卖家、圣诞节营销 圣诞节——对跨境电商卖家来说是非常重要的促销节日。根据以往的经验,您或许已经有了初步的促销想法,想知道您今年的跨境电子商务营销策略是否正确?为您整理了跨境电商卖家必须注意的营销技巧&am…

TiDB数据库架构——TiDB Server

TiDB Server架构 TiDB Server 是SQL层,无状态,启动多个TiDBServer,均匀分摊,解析SQL,获取真实数据。 Protocol Layer、:负责客户端的连接。 Parse、Compile:负责SQL语句的解析和编译&#xff…

信息控制信息卷积

🍿*★,*:.☆欢迎您/$:*.★* 🍿 目录 背景

少儿编程 电子学会图形化 scratch编程等级考试四级真题答案解析(判断题)2022年9月

目录 2022年9月scratch编程等级考试四级真题 判断题(共10题,每题2分,共20分) 推荐资料

java学生作业带选课管理系统ssh

1.管理员具有对学校课程信息,教师信息,学生信息增删改查的权限 (1)可以录入学校所开课程,学生信息,教师信息; (2)可以对教师的开课信息进行增加,删除&#xf…

什么是 DeGods NFT 系列?

Nov. 2022, Vincy Data Source: Footprint Analytics - DeGods NFT Collection DeGods 系列有 10,000 个 Solana 铸造头牌的 NFT。 DeGods 持有者拥有访问 DeDAO 的权限和社区。 它在 1 月推出 DUST 协议,允许持有者质押他们的 DeGods NFT 并赚取 DUST。 10 月 …

cmake 工具 三 add_libary, set_target_properties,link_libary, target_link_libary

一起通过一个例子学一下 add_libary, set_target_properties,link_libary, target_link_libary 四个命令 首先创建如下的文件: 其中 build用于cmake编译,防止大量编译的中间文件污染代码文件夹具体可见cmake 构建工具…

手机端宝贝描述中每张图片的宽要在480到1500之间,最大高度为2500, 以下图片不满足

上图是近期小编与一位店主的聊天截图,从截图中我们可以知道,这位店主在使用复制软件来复制宝贝上传时出现了一些问题,下面,小编将上传出现的错误、分析过程及解决方法列示如下,希望能给其他店主一些帮助:查…

批量图片压缩怎么做?分享三招图片压缩怎么操作的方法

因为工作需要在电脑上保存大量图片的小伙伴们,是不是图片一下子把电脑内存占满了,可是要怎么做才能减少图片的占用空间呢?我们可以把图片压缩,这样子就可以保存更多的图片啦。还不清楚批量图片压缩怎么做的小伙伴们,让…

光点数据中台,解决高校信息整合难题_光点科技

目前,国家和相关部门对教育信息化高度重视,先后出台了多项政策和文件,要求加快教育信息化的发展步伐,高校信息化进入了快速发展期。 在此背景下,数据也将会成为高校信息化的核心资产,并对高校信息化的快速发…

【Big Data】解决Hive查询出现Java.lang.OutMemoryError.java heap space

一、Introduction 在使用Hive时,出现了以下的问题 错误的原因是资源分配不够,但是错误的原因有很多,需要去查看日志文件观察具体的错误。 日志文件位置在 /tmp/root/hive.log 由此我们知道具体的错误原因是JVM资源分配不够 接下来可以尝试…

PE格式:手写PE结构解析工具

PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如文件加密与解密,病毒分析,外挂技术等,在PE文件中我们最需要关注,PE结构,导入表,…

Tech Lead如何组建你的全明星团队

当你成为 Tech lead,意味着你不再只是团队中的普通一员。现在你是开发团队的Leader,换句话讲,这是一支你的团队。你需要费尽心思组建和打造你的团队! 组建搭配合理的团队 (图片来自于 pixabay) 作为Tech Lead,你要先…

Jmeter,将响应结果保存至csv文件,并读取csv文件

在做性能测试的时候,需要模拟多个不同的用户同时进行操作,此时可以将响应数据中的某些字段(比如token字段)提取出来,以供下一接口作为入参。 一、将响应结果中的字段提取,并保存至CSV文件【分为2个步骤】 …

Redis管理客户端,兼容Windows、Mac、Linux

真正的大师,永远都怀着一颗学徒的心! 一、项目简介 Redis管理客户端,兼容Windows、Mac、Linux 二、实现功能 支持自定义文本视图 支持哨兵支持 Hash List Set Zset搜索支持 支持自动更新 支持SSH 通道支持 支持精确搜索 单链接支持 支持Redis&g…

外观(门面)模式

思考外观模式 正常完成一个功能需要调很多个接口,外观模式就是组装这些接口为一个接口,对外提供这一个接口,用户调用这一个接口就能完成原来多个接口才能完成的功能,简化调用 1.外观模式的本质 外观模式的本质是:封装交…

用户管理系统(1)

1)用户管理项目:基本功能介绍 1)登录功能:只能是超级管理员管理员登录,普通用户无法进行登录 2)用户的列表页面:普通用户的列表页和超级管理员的列表页 3)条件查询:组合条件查询,不定规则的查询,指定名称,指定籍贯,指定…

相控阵天线(二):非规则线阵(稀布阵列、稀疏阵列、平方率分布阵列)

概述 非规则线阵主要包括以下情况: 1. 不均匀间距阵列: a)不均匀间距递变阵列:单元间距按照一定的系数递增; b)稀布阵列:阵元间隔不是固定的,没有规律; c)稀…

广州蓝景分享—「JavaScript」this关键字的五个重要事项

首先this 关键字是 JavaScript 中最令人困惑的部分之一,今天通过介绍有关它的五个重要事项来阐明其目的和用法。 1、它允许访问同一对象上的其他属性 在 JavaScript 中,函数可以是独立的单元,但它们也可以用作对象的值。 考虑下一个对象。 …