Mysql函数FIND_IN_SET()的使用方法

Mysql函数FIND_IN_SET()的使用方法

https://www.cnblogs.com/gpfeisoft/p/5535450.html

有了FIND_IN_SET这个函数。我们可以设计一个如:一只手机即是智能机,又是Andriod系统的。

比如:有个产品表里有一个type字段,他存储的是产品(手机)类型,有 1、智能机,2、Andriod系统,3、小米系统,4、1000元以下

现在有条手机的记录即是1000元以下的,又是智能机,还是Andriod的系统。

type中以 4,1,2的格式存储.

那们我们如何用sql查找所有type中有4的1000元以下的手机呢,

这就要我们的find_in_set出马的时候到了.

先看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’);

+—————————-+

| FIND_IN_SET(‘b’,’a,b,c,d’) |

+—————————-+

|                          2 |

+—————————-+

1 row in set (0.00 sec)

用起来很简单

就以上面我说到的情况来举例:

以下为实际应用当中的SQL语句:

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

这个就可以找出所有1000元以下手机的记录!

 

______________________________________________________________________________________________________________

查询表字段 pingid = (1,2,3,)

 

SELECT * FROM `linkinfo` WHERE `pingid` REGEXP ‘{id},’ AND `pingid` NOT REGEXP ‘[[:alnum:]]+{id},’   使用上面的语句,可以查询出来

 

用FIND_IN_SET() 更简单

 

SELECT * FROM linkinfo WHERE FIND_IN_SET( ‘1’, pingid )

 

 

 

原来以为mysql可以进行这样的查询
select id, list, name from table where ‘daodao’ IN (list);      (一)
注:1. table含有三个字段id:int, list:varchar(255), name:varchar(255)

实际上这样是不行的,这样只有当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()函数

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/113102.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java递归查询数据库数据[通俗易懂]

    java递归查询数据库数据[通俗易懂]先查询第一层的数据,然后调用递归循环第一层的数据,查询父Id等于第一层的Id,执行完成后第一层一下的所有数据就全部查询出来了。。。publicList<Information>getTreeList(IntegertopId){ Stringhql="fromInformationwhereisDelete=2andid="+topId; List&l…

    2022年9月15日
    1
  • JAVA面试题:HashMap和Hashtable的区别

    JAVA面试题:HashMap和Hashtable的区别 HashMap和Hashtable的区别1.共同点:都是双列集合,底层都是哈希算法2.区别:*1.HashMap是线程不安全的,效率高,JDK1.2版本*Hashtable是线程安全的,效率低,JDK1.0版本*2.HashMap可以存储null键和null值*Hashtable不可以存储null键和null值3.代码示例:publicclasstes…

    2022年9月17日
    2
  • java jediscluster_【集群】JedisCluster 原理

    java jediscluster_【集群】JedisCluster 原理1.JedisCluster类结构JedisCluster是针对RedisCluster的java客户端,它封装了java访问redis集群的各种操作,包括初始化连接、请求重定向等。我们先来看下JedisCluster的类结构:JedisCluster初始化时,所有的集群连接信息都是封装在JedisClusterInfoCache里,由于jedis本身不是线程安全的,所以使用对象池JedisPo…

    2022年10月14日
    2
  • 关于MIUI12.5或者任何无法使用GMS谷歌全家桶的解决办法[通俗易懂]

    关于MIUI12.5或者任何无法使用GMS谷歌全家桶的解决办法[通俗易懂]首先感谢酷安社区的@兔子吃肉不吃草原文链接:https://www.coolapk.com/feed/24583874由于其文章全部都是图片贴的代码而且没加说明对于小白比较难懂,我在这里对其进行进一步的补充和完善必要条件:手机已经root,电脑安装有adb(不知道adb是什么没关系,下载个小米助手,里边会自带一个adb.exe)开始1.电脑连接手机手机打开usb调试,电脑连接手机2.进入adb命令行如果你之前已经安装了adb并且配置了环境变量,可以直接打开cmd

    2022年6月27日
    142
  • Spring Cloud Alibaba与Spring Boot、Spring Cloud版本对应关系

    Spring Cloud Alibaba与Spring Boot、Spring Cloud版本对应关系一、前言在搭建SpringCloud项目环境架构的时候,Springboot版本与SpringCloud版本对应关系很重要,如果版本不对应,常见的会遇见项目启动不起来,怪异的会是项目出现一些诡异的问题。ReleasetrainSpringBootcompatibilitySpringCloudReleaseTrainSpringBootVersionHo…

    2022年6月3日
    105
  • soapUI简介

    soapUI简介接口测试中 SoapUI 是很好的第三方工具 可模拟 http webservice 等多种协议请求进行测试 SoapUI 模拟请求方发送 http webservice 的 request 请求 SoapUI 模拟服务端作为测试桩进行 http 和 webservice 协议接口测试 专门针对 webservice 接口的测试时 SoaqUI 表现出来的性能更优越 更真实 更接近地反映接口的性能指标 SOAPW

    2025年7月9日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号