Oracle FIND_IN_SET函数

最近笔者遇到一个需求。在数据库中有下方表格所示类型的一个列,每个值都是由ID拼接的字符串,用户希望能针对这个列做到数据检索,要求数据值只要包含传入值,即视为满足检索条件。
Oracle FIND_IN_SET函数_第1张图片

笔者的第一反应就是:简单!!!
二话不说立马写SQL

select t.* from TABLE_T t where instr(t.ids, '8') > 0

运行,这个时候发现结果如下:
Oracle FIND_IN_SET函数_第2张图片

上述的查询结果其实是不满足条件的,因为我传入一个’8’,按照正常情况应该只查询出第4条数据才对,但是因为’6,88’也包含了’8’,所以也查出来了。

想了一想,INLIKE肯定也满足不了需求啊。笔者开始难受,搜肠刮肚,无奈肚中没有多少知识储备,此刻我的心情是这样的:
在这里插入图片描述
书到用时方恨少!!!

但是万能的水友提示我,MySql有一个find_in_set函数可以解决我的需求,二话不说,百度一下
在这里插入图片描述
看了一下大佬对于这个函数的解释:
Oracle FIND_IN_SET函数_第3张图片
果然能满足我的需求!

但是,oracle 12c并没有这个函数!!!只好看一下前辈有没有造过类似的轮子,不失所望,真有!
参考地址:https://blog.51cto.com/xiaok007/2139728
函数具体实现如下:

CREATE OR REPLACE FUNCTION FIND_IN_SET(piv_str1 varchar2, piv_str2 varchar2, p_sep varchar2 := ',')

RETURN NUMBER IS      

  l_idx    number:=0; -- 用于计算piv_str2中分隔符的位置  

  str      varchar2(500);  -- 根据分隔符截取的子字符串  

  piv_str  varchar2(500) := piv_str2; -- 将piv_str2赋值给piv_str  

  res      number:=0; -- 返回结果  

  loopIndex number:=0;

BEGIN  

-- 如果piv_str中没有分割符,直接判断piv_str1和piv_str是否相等,相等 res=1  

IF instr(piv_str, p_sep, 1) = 0 THEN  

   IF piv_str = piv_str1 THEN   

      res:= 1;  

   END IF;  

ELSE  

-- 循环按分隔符截取piv_str  

LOOP  

    l_idx := instr(piv_str,p_sep);  

     loopIndex:=loopIndex+1;

-- 当piv_str中还有分隔符时  

      IF l_idx > 0 THEN  



   -- 截取第一个分隔符前的字段str  

         str:= substr(piv_str,1,l_idx-1);  

   -- 判断 str 和piv_str1 是否相等,相等 res=1 并结束循环判断  

         IF str = piv_str1 THEN   

           res:= loopIndex;  

           EXIT;  

         END IF;  

        piv_str := substr(piv_str,l_idx+length(p_sep));  

      ELSE  

   -- 当截取后的piv_str 中不存在分割符时,判断piv_str和piv_str1是否相等,相等 res=1  

        IF piv_str = piv_str1 THEN   

           res:= loopIndex;  

        END IF;  

        -- 无论最后是否相等,都跳出循环  

        EXIT;  

      END IF;  

END LOOP;  

-- 结束循环  

END IF;  

-- 返回res  

RETURN res;  

END FIND_IN_SET;  

然后再运行一下sql

select t.* from TABLE_T t where find_in_set('8', t.ids) > 0

结果就满足要求了!
Oracle FIND_IN_SET函数_第4张图片
补充:上面忘记讲了。函数的第三个参数是目标字段的分隔符,默认是英文逗号。如果使用的是别的分隔符的话,在使用函数时,需要传入相应的分隔符哦!

你可能感兴趣的:(oracle)