————————————————
版权声明:本文为CSDN博主「炎升」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40482816/article/details/121142254
1、find_in_set() 函数 :
查询字段(str)在(strlist)中的位置。
1.1、语法
FIND_IN_SET (str,strlist)
str :要查询的字符串。
strlist :字段名, 参数以”,”分隔。 如 (1,2,6,8,10,22)。
注:
字符串str在 (由N个子链 组成的字符串列表strlist) 中,则返回值的范围在 1 到 N 之间。
如果str不在strlist中 或 strlist 为空字符串,则返回值为 0。
如任意一个参数为NULL,则返回值为 NULL。
1.2、示例:
-
SELECT FIND_IN_SET(
'b',
'a,b,c,d');
-- 结果:2 ,因为b 在strlist集合中放在2的位置(从1开始)。
-
select FIND_IN_SET(
'1',"1,2,3");
-- 返回:1
-
select FIND_IN_SET(
'2',"1,2,3");
-- 返回:2
-
select FIND_IN_SET(
'',"1,2,3");
-- 返回:0
-
select FIND_IN_SET(
'2',"");
-- 返回:0
-
select FIND_IN_SET(
null,"1,2,3");
-- 返回:null
-
select FIND_IN_SET(
'1',
null);
-- 返回:null
-
select FIND_IN_SET(
null,
null);
-- 返回:null
2、instr()函数
俗称:字符查找函数。 获取子串第一次出现的索引,如果没有找到,则返回0(从1开始)。
2.1、语法
格式一:
instr( string1, string2 )
说明: instr(源字符串, 目标字符串)
例如:INSTR('apple','a'),返回的查询结果是1(a出现在字符串‘apple’中的第一个索引;
3、效率
IND_IN_SET 效率
-
SELECT
*
FROM fast_input f
where FIND_IN_SET(id,
'4,14,144');
-
受影响的行:
0
-
时间:
0.022s
INSTR 效率
-
SELECT
*
FROM fast_input f
where INSTR(CONCAT(
',',
'4,14,144',
','),CONCAT(
',',id,
','))
>
0;
-
受影响的行:
0
-
时间:
0.032s
IN 效率
-
SELECT
*
FROM fast_input f
where id
in(
'4',
'14',
'144');
-
受影响的行:
0
-
时间:
0.001s
从上面这里可以清楚的看到,IN由于使用了主键的索引,效率最高。其次是 FIND_IN_SET,最慢的是INSTR。
从而得到一个效率结果排名:IN() 效率 > FIND_IN_SET() > INSTR()。
总结:
在实际应用中,大家可以根据实际情况使用IN或者FIND_IN_SET函数,一个效率高,一个运用方便。像我这里,传过来接收的参数是一个类似于:'1,2,3,4,5,6' 的字符串,这种情况直接用 IN 是无效的,需要把字符串分割再重新组装,我就需要直接用 FIND_IN_SET 简单多了。