问题:
在oracle中没有split这个函数,但是我们可能会经常分割字符串,这时,我们可以写一个自定义的函数,实现split分割字符串的效果。
解决方法:
create or replace type varchartype as table of varchar2(200);
-- 创建一个table类型,用于接受分割下来的字符串
-- 创建函数
create or replace function fun_split(str varchar2) return varchartype
is
strs varchartype:=varchartype(); --声明一个strs名字为varchartype的table类型
v_i number(2):=1; --记录我是第几个,
v_begin number(2):=1; --截取字符串的开始
v_index number(2):=0; --查找字符(如,等)的索引
begin
loop
v_index:=instr(str,',',1,v_i);
strs.extend; --手动扩展strs的下标
if v_index=0 then --当查找的字符位置为0时即为未找到,直接取字符串即可
strs(v_i):=substr(str,v_begin);
exit;
end if;
strs(v_i):=substr(str,v_begin,v_index-v_begin); --找到时,找截取字符串的规律
v_begin:=v_index+1; --为下一次截取字符串的开始位置赋值
v_i:=v_i+1; --为查找下一个字符的位置赋值
end loop;
return strs; --返回截取后的字符集
end;
测试:
select fun_split('a,b,c,d,aa,bb,cc,dd') from dual;
补充:如果要把这个字符集当做一列去使用时还需要进行转换
select * from table(fun_split('20,30'));
这样,就可以把分割的结果集当成一列来使用。