达梦数据库实现类似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_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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值