原文链接:关于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行
五、借鉴链接
更多知识持续更新中!!!
声明
借鉴部分均注明了原文出处,可在文章的借鉴链接处获取原文出处
文中若内容有涉及原版权,请邮件联系[email protected],涉及的相关文章或内容将会及时更改或取消发布