本篇文章主要介绍mysql中FIND_IN_SET函数用法,用来精确查询字段中以逗号分隔的数据

以及其与 like 和 in 的区别

1.问题发现

之前在做工作任务时有这么一个需求:需要用接口所传的服务商编号和所开通的产品类型查询这张表中是否有此信息来做返回结果。

但公司的产品类型有多个,每个服务商可能开通了多个不同的产品类型,存入产品类型时用的是一个字段,用逗号分隔开存储。

这种场景下就需要精确查找其产品类型,我一开始想的是用 in 和 like 来实现,但实际使用后并不是这种效果...请看下文讲解~

2.解决问题

使用 in 实现

sql语句如下:

SELECT
agentNum
FROM
p4_agent_limit_merc_access a
WHERE
agentNum = #{agentNum} (传入的服务商编号)
AND #{productType} (传入的产品类型)
IN(a.productType);

但实际上这样写是查不到数据的,只有a.productType 字段的值等于传入的产品类型时(和IN前面的字符串完全匹配),这时查询才有效,否则是查不到结果的,即使a.productType 里面包含传入的产品类型。

使用 like 实现

sql语句如下:

SELECT
agentNum
FROM
p4_agent_limit_merc_access a
WHERE
agentNum = #{agentNum}
AND a.productType
LIKE concat('%',#{productType}, '%');

表面看上去这样写是没问题的,但你细品一下,就知道问题很大,因为like是广泛的模糊查询,但一个字符串里包含你要传入的值时,也能查出来,比如我们的产品类型productType有QPOS和POS,然而此次查询的服务商只开通了QPOS产品,我却传入了POS这个类型,用上述语句查询后也能查出这条结果,这就是问题所在,所以用like查询出的范围会更广,这样明显不合理,不是我们想要的结果...

使用FIND_IN_SET函数实现

首先介绍下 FIND_IN_SET函数:

FIND_IN_SET(str,strlist)

str 要查询的字符串

strlist 字段名 参数以”,”分隔 如 (1,2,6,8)

查询字段(strlist)中包含(str)的结果,返回结果为null或记录

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

介绍简单了解下就好,具体看怎么用,我的sql如下:

SELECT
agentNum
FROM
p4_agent_limit_merc_access a
WHERE
agentNum = #{agentNum}
AND FIND_IN_SET(#{productType},a.productType);

使用上述语句就可以精确查询出数据,实现需求。

再来看看FIND_IN_SET函数具体使用例子:

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

3.总结

当 a.productType 字段是常量时,则可以用 in 来实现。

当其为变量时,则必须要用FIND_IN_SET函数来实现了。

 更多精彩功能请关注我的个人博客网站:https://liujian.cool

  欢迎关注我的个人公众号:程序猿刘川枫

  

mysql中FIND_IN_SET函数用法的更多相关文章

  1. mysql中find_in_set()函数的使用

    首先举个例子来说: 有个文章表里面有个type字段,它存储的是文章类型,有 1头条.2推荐.3热点.4图文等等 .现在有篇文章他既是头条,又是热点,还是图文,type中以 1,3,4 的格式存储.那我 ...

  2. MYSQL中 FIND_IN_SET 函数

    每天掌握一点,你的知识财富就多一点  今天在维护项目的时候发现了个MYSQL的FIND_IN_SET函数,之前接触太浅,今天又涨点知识了.下面是做个测试 1.创建一张test表,并添加数据 2.编写s ...

  3. mysql中FIND_IN_SET函数的使用

    有种需求,A和B是父子关系,B和C是父子关系,C与D亦是父子关系,以此类推,无限级 现在需要查询到某一级(包括本级)下面所有的,就需要用到FIND_IN_SET函数 select * from tab ...

  4. 013 mysql中find_in_set()函数的使用

    在工作中遇见过,对于新知识,在这里写一写文档. 1.作用 举个例子,也许不理解,在看完后面的SQL示例,再来看就明白了: 有个文章表里面有个type字段,它存储的是文章类型,有 1头条.2推荐.3热点 ...

  5. mysql中group_concat函数用法

    该函数返回带有来自一个组的连接的非NULL值的字符串结果.该函数是一个增强的Sybase SQL Anywhere支持的基本LIST()函数. 语法结构: GROUP_CONCAT([DISTINCT ...

  6. mySql中SUBSTRING_INDEX函数用法

    SUBSTRING_INDEX(str,delim,count) 返回字符串 str 中在第 count 个出现的分隔符 delim 之前的子串.如果 count 是一个正数,返回从最后的(从左边开始 ...

  7. MySQL中count函数使用方法详解

      count函数是用来统计表中或数组中记录的一个函数,下面我来介绍在MySQL中count函数用法与性能比较吧. count(*) 它返回检索行的数目, 不论其是否包含 NULL值. SELECT ...

  8. Mysql中FIND_IN_SET()和IN区别简析

    来源:http://www.jb51.net/article/125744.htm 测试SQL: CREATE TABLE `test` ( `id` int(8) NOT NULL auto_inc ...

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

    mysql 中find_in_set()和in()用法比较 在mysql中in可以包括指定的数字,而find_in_set()用于特定的数据类型. find_in_set 函数使用方法 个例子来说:有 ...

随机推荐

  1. CORS All In One

    CORS All In One 跨域资源共享 https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS CORS 请求类型 简单请求 预检请求 Ac ...

  2. W3C & 弹幕

    W3C & 弹幕 弹幕用例规范 Draft Community Group Report 21 August 2020 refs https://w3c.github.io/danmaku/u ...

  3. CSS border gradient color All In One

    CSS border gradient color All In One CSS Gradient Borders border-image-source & border-image-sli ...

  4. taro demos & taro 组件库

    taro demos & taro 组件库 ui demo https://github.com/qit-team/taro-yanxuan https://github.com/fengch ...

  5. Dart: 编码和解码各种存档和压缩格式

    path archive import 'dart:io'; import 'package:path/path.dart' as p; import 'package:path/path.dart' ...

  6. 「NGK每日快讯」12.4日NGK公链第31期官方快讯!

  7. git设置、查看、取消代理

    设置代理: git config --global http.proxy 'socks5://127.0.0.1:1080' git config --global https.proxy 'sock ...

  8. UDP编程详解

    目录 报文格式 通信过程 UDP客户端流程 UDP客户端编码 UDP服务器流程 UDP服务器编码 参考文献 UDP与TCP的不同之处是:他的通信不需要建立连接的过程.中文名称用户数据报协议.时OSI参 ...

  9. C#从1970年开始到现在时间的总秒数

    TimeSpan timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1)); string timeStamp = ((int)timeSpan. ...

  10. IntelliJ IDEA 还能画思维导图,果然最强 IDE!

    最近栈长发现 IntelliJ IDEA 居然还能画思维导图,太牛逼了! 当然这得借助 IDEA 的 UML 插件,因为它本身也是一个 UML 图,所以这篇就从 UML 图开撕,看 IDEA 怎么画思 ...