ORACLE自定义实现FIND_IN_SET函数

FIND_IN_SET是mysql中的函数,见:MySQL中FIND_IN_SET函数

oracle中没有FIND_IN_SET函数,oracle自定义实现FIND_IN_SET函数sql如下:

-- FIND_IN_SET函数
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;
/

FIND_IN_SET函数使用示例如下

 

posted @ 2023-03-10 17:11  harara  阅读(243)  评论(0编辑  收藏  举报