CREATE OR REPLACE FUNCTION FIND_IN_SET
(
piv_str1 varchar2, -- 查询参数
piv_str2 varchar2, -- 库中字段
p_sep varchar2 := ',')
RETURN NUMBER
IS
l_idx number:=0; -- 用于计算piv_str1中分隔符的位置
str varchar2(50); -- 根据分隔符截取的子字符串
piv_str varchar2(4000) := piv_str1; -- 将piv_str1赋值给piv_str
res number :=0; -- 返回结果
loopIndex number :=0;
BEGIN
-- 如果piv_str中没有分割符,直接判断piv_str1是否在piv_str2中存在,存在则 res=1
IF instr(piv_str, p_sep, 1) = 0 THEN
IF LOCATE(piv_str,piv_str2) > 0 THEN
res := 1;
END IF;
ELSE
-- 循环按分隔符截取piv_str
LOOP
-- 从输入字符串 piv_str 中查找字符串p_sep 出现的位置,以字符计算
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_str2中存在,存在 res=1 并继续循环判断
IF LOCATE(str,piv_str2) > 0 THEN
res:= loopIndex;
-- EXIT;
END IF;
piv_str := substr(piv_str, l_idx+length(p_sep));
ELSE
-- 当截取后的piv_str 中不存在分割符时,判断piv_str是否在piv_str2中存在,存在则 res=1
IF LOCATE(piv_str,piv_str2) > 0 THEN
res:= loopIndex;
END IF;
-- 无论最后是否相等,都跳出循环
EXIT;
END IF;
END LOOP;
-- 结束循环
END IF;
-- 返回res
RETURN res;
END FIND_IN_SET;
达梦数据库实现类似mysql中find_in_set的升级版
最新推荐文章于 2024-07-01 22:23:23 发布