CREATE OR REPLACE FUNCTION split_query RETURN(piv_str varchar2, p_sep varchar2 := ',')
l_idx number:=0; -- 用于计算piv_str1中分隔符的位置
str varchar2(500); -- 根据分隔符截取的子字符串
piv_str_a varchar2(500) := piv_str; -- 将piv_str赋值给piv_str_a
nick_name_str VARCHAR2(500); --查询到的结果
ret_str varchar2(500); -- 返回的数据
BEGIN
-- 如果piv_str中没有分割符,直接判断piv_str1和piv_str是否相等,相等 res=1
IF instr(piv_str, p_sep, 1) = 0 THEN
IF piv_str = piv_str_a THEN
SELECT NICK_NAME AS nick_name_str from SYS_USER su where su.user_name = piv_str
ret_str := nick_name_str;
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);
SELECT NICK_NAME AS nick_name_str from SYS_USER su where su.user_name = str
ret_str = concat(ret_str, concat('/', nick_name_str))
-- 无论最后是否相等,都跳出循环
EXIT;
END IF;
END LOOP;
-- 结束循环
END IF;
-- 返回ret_str
RETURN ret_str;
END;
函数调用 split_query('10202804/10133066/10131810','/')
上传的代码貌似不太友好,还要别人帮你排版
翻翻尘封的书,做了该问题的完整测试。
形成Word文档《oracle数据库自定义split函数问题》:
https://download.csdn.net/download/m0_54619218/87246637
创建测试用表test_01:
create table test_01 (name varchar2(10),bh varchar2(8));
insert into test_01 values('张三','10202804');
insert into test_01 values('李四','10133066');
insert into test_01 values('王五','10133067');
commit;
如果Oracle 建库时包含APEX,则直接可以使用
select * from table(apex_string.split('10202804/10133066/10131810','/')) ;
Oracle 用 REGEXP_SUBSTR 实现split语句如下:
SELECT REGEXP_SUBSTR('10202804/10133066/10131810', '[^/]+', 1, LEVEL, 'i') AS STR
FROM DUAL CONNECT BY LEVEL <=LENGTH('10202804/10133066/10131810') - LENGTH(REGEXP_REPLACE('10202804/10133066/10131810', '/', ''))+1;
自定义函数具体实现:使用REGEXP_SUBSTR创建split函数,分隔符可以自定义,设置默认分隔符’/’,可以免输入。
创建job_split函数调用split,关联test_01表,按字符串参数输入顺序返回结果。
用例结果 10202804/ 10133066/ 10131810
张三/李四/10131810(不存在)
请参考附件:完整代码
测试结果:自定义分割符有效
select job_split('10202804/10133066/10131810','/') as res_str from dual;
select job_split('10202804,10133066,10131810',',') as res_str from dual;
select job_split('10202804:10133066:10131810',':') as res_str from dual;