oracle 常用自定义函数

一、实现 mysql 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(4000) := piv_str2; -- 将piv_str2赋值给piv_str
  res      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);
-- 当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:= 1;
           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:= 1;
        END IF;
        -- 无论最后是否相等,都跳出循环
        EXIT;
      END IF;
END LOOP;
-- 结束循环
END IF;
-- 返回res
RETURN res;
END FIND_IN_SET;

二、只要前面的id串中,有一个id出现在后面的串,就返回1,否则返回0

CREATE OR REPLACE FUNCTION CHECKS2(piv_str1 varchar2, piv_str2 varchar2, p_sep varchar2 := ',')
RETURN NUMBER IS   
  l_idx    number:=0; -- 用于计算piv_str1中分隔符的位置
  str      varchar2(500);  -- 根据分隔符截取的子字符串
 piv_str0  varchar2(4000) := piv_str1; -- 将piv_str1赋值给piv_str0
  piv_str  varchar2(4000) := piv_str2; -- 将piv_str2赋值给piv_str
  res      number:=0; -- 返回结果
BEGIN
-- 如果piv_str中没有分割符,直接判断piv_str1和piv_str是否相等,相等 res=1
IF instr(piv_str, p_sep, 1) = 0 and instr(piv_str0, p_sep, 1) = 0 THEN
   IF piv_str0 = piv_str THEN
      res:= 1;
   END IF;
ELSE
  if (piv_str0 is not null) then

    loop

      str:='';
      mx_splitstring(piv_str0,',',str);
      if str is not null then

          if find_in_set(str,piv_str)>0 then

             res:=1;  
             return res;

          end if;

      end if;

    exit when piv_str0 is null;
    end loop;

  end if;


/*

-- 循环按分隔符截取piv_str
LOOP
    l_idx := instr(piv_str0,p_sep);
-- 当piv_str中还有分隔符时
      IF l_idx > 0 THEN
   -- 截取第一个分隔符前的字段str
         str:= substr(piv_str0,1,l_idx-1);
                res:= Find_IN_set(str, piv_str2);
         IF res > 0 THEN
           EXIT;
         END IF;
        piv_str0 := substr(piv_str0,l_idx+length(p_sep));
--      ELSE
   -- 当截取后的piv_str 中不存在分割符时,判断piv_str和piv_str1是否相等,相等 res=1
 --       IF piv_str0 = piv_str1 THEN
 --          res:= 1;
 --       END IF;
  --      -- 无论最后是否相等,都跳出循环
  --      EXIT;
     END IF;
END LOOP;
-- 结束循环
*/
END IF;
-- 返回res
RETURN res;
END ;

三、后面的ID串是否全部包含前面的ID串,如果是则返回1,否则返回0

CREATE OR REPLACE FUNCTION CHECKS_all_in(piv_str1 varchar2, piv_str2 varchar2, p_sep varchar2 := ',')
RETURN NUMBER IS   
  l_idx    number:=0; -- 用于计算piv_str1中分隔符的位置
  str      varchar2(500);  -- 根据分隔符截取的子字符串
 piv_str0  varchar2(4000) := piv_str1; -- 将piv_str1赋值给piv_str0
  piv_str  varchar2(4000) := piv_str2; -- 将piv_str2赋值给piv_str
  res      number:=1; -- 返回结果
BEGIN
-- 如果piv_str中没有分割符,直接判断piv_str1和piv_str是否相等,相等 res=1
IF instr(piv_str, p_sep, 1) = 0 and instr(piv_str0, p_sep, 1) = 0 THEN
   IF piv_str0 = piv_str THEN
      res:= 1;
   END IF;
ELSE
  if (piv_str0 is not null) then

    loop

      str:='';
      mx_splitstring(piv_str0,',',str);
      if str is not null then

          if find_in_set(str,piv_str)<=0 then

             res:=0;  
             return res;

          end if;

      end if;

    exit when piv_str0 is null;
    end loop;

  end if;


/*

-- 循环按分隔符截取piv_str
LOOP
    l_idx := instr(piv_str0,p_sep);
-- 当piv_str中还有分隔符时
      IF l_idx > 0 THEN
   -- 截取第一个分隔符前的字段str
         str:= substr(piv_str0,1,l_idx-1);
                res:= Find_IN_set(str, piv_str2);
         IF res > 0 THEN
           EXIT;
         END IF;
        piv_str0 := substr(piv_str0,l_idx+length(p_sep));
--      ELSE
   -- 当截取后的piv_str 中不存在分割符时,判断piv_str和piv_str1是否相等,相等 res=1
 --       IF piv_str0 = piv_str1 THEN
 --          res:= 1;
 --       END IF;
  --      -- 无论最后是否相等,都跳出循环
  --      EXIT;
     END IF;
END LOOP;
-- 结束循环
*/
END IF;
-- 返回res
RETURN res;
END ;
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值