mysql的in_like_find_in_set()
what:(现象)
在做select的where条件时,发现in的条件集中使用“子select”运行不符合预期,如下图:
正常结果:
异常:
how:
通过查询后发现有个函数FIND_IN_SET(str,strlist)。
具体的描述:
参数:str 要查询的字符串
strlist 以”,”分隔的参数, 如 (1,2,6,8)
功能:查询字段(strlist)中包含(str)的结果,返回结果为null或记录的index。
概述:假如字符串str,在由N个字符串组成的字符串列表strlist 中,则返回值为index,范围在 1 (从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开始。
why:(原因)
IN:
上例子中:
select * from ts_deploy_package WHERE package_id in (select '271,26,1');
select * from ts_deploy_package WHERE package_id in (select '27,26,1');
实际运行时异常的,只有package_id和in条件集中的第一个完全匹配,才能返回1条结果。
但是:select * from ts_deploy_package WHERE package_id in ('26','27','1'); 运行正常。
原因是:如果in的条件集合是常量,则可以直接用IN; 否则要用find_in_set()函数。
like:
find_in_set()和like很像,它们的diff:
1、like是广泛的模糊匹配,字符串中没有分隔符;
2、Find_IN_SET 是精确匹配,字段值以英文”,”分隔;
3、Find_IN_SET查询的结果要小于like查询的结果;