关于oracle使用find_in_set函数

封面

原文链接:关于oracle使用find_in_set函数 | Elvin

一、find_in_set函数概述

find_in_set函数可以对数据表里面某一项由英文逗号隔开的的值(字符串)进行检索。

find_in_set(str,strlist),str:要查询的字符串;strlist:由英文逗号隔开的字符串

与MySQL不同?

mysql中自带了find_in_set函数,直接可以使用这个函数;oracle没有这个函数,需要我们手动创建find_in_set函数

二、find_in_set函数如何查询数据

如图所示,表中有一列名为version_type的列,它的值都是由英文逗号隔开的(version_type:1,2,3)字符串组成。

// 在mysql中,我们可以使用find_in_set函数进行精准搜索,如下

select *  from test where find_in_set('1',version_type);

// 这条语句可以查询出[列version_type]包含1的数据行

为什么不使用in或like?

不使用in的原因:因为使用in时,必须是version_type的列值等于1才能查询出数据;

不使用like的原因:而使用like的话,它的匹配方式更广泛,在检索是只要包含这个字符都会返回,我们需要精确取到1这个值,like会把11、21、111等有1在的值都匹配,故而不能like

find_in_set函数

它只能搜索逗号隔开的具体的值,比like更精准,必须是1或2或3这样的形式,故而在需要得到包含1的值时find_in_set函数更适合。

三、在oracle中创建find_in_set函数

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

默认是逗号隔开,也可以替换为其它的字符隔开。如:p_sep varchar2 := '|'

⚠️:如果是换成其它字符隔开,则查询时需要传入隔开的字符,详细请看oracle使用方法

创建函数的sql如下:

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;

四、使用方法

数据示意如下:

1、在MySQL中

使用方法如下:

select *  from test where find_in_set('2',version_type);

// 查询列VERSION_TYPE包含2的数据行
// 查询结果为2行

2、在oracle中

使用方法如下:

select find_in_set('1','1,2,3,4')  from test
select * from test where find_in_set('1',version_type) > 0
  
// 查询列VERSION_TYPE包含1的数据行
// 查询结果为3行

如果函数使用了别的分隔符,则要传入分隔符,方法如下:

select * from test where find_in_set('1',version_type,'|') > 0
  
// 查询列VERSION_TYPE包含1的数据行(数据由”|“分隔)
// 查询结果为3行

五、借鉴链接

oracle FIND_IN_SET函数

mysql中find_in_set()函数的使用


更多知识持续更新中!!!


声明

借鉴部分均注明了原文出处,可在文章的借鉴链接处获取原文出处

文中若内容有涉及原版权,请邮件联系[email protected],涉及的相关文章或内容将会及时更改或取消发布

猜你喜欢

转载自blog.csdn.net/weixin_42464282/article/details/130990306
今日推荐