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查询的结果;

 

posted @ 2022-05-19 23:33  修心而结网  阅读(102)  评论(0编辑  收藏  举报