起因:我是常驻客户这边的技术支持,今天同时遇到对方两个技术人员类似的问题,就是要求
提取“hangzhou-Tvportal#首页#体育最前线#魅力足球#欧洲冠军杯”以“#”为分割符的其中
的某个字段,找了下oracle函数,好像没有对应的这样的。当时只要临时写了一个:
select substr(str, instr(str,'#',1,2)+1, instr(str, '#', 1, 3) - instr(str,'#',1,2)-1)
比较土,不过应该是这个函数的原始版本了。
过后我想应该可以有一种更加通用方便的方式来实现这类问题,于是就产生了这个函数:
create or replace function w_func_getstrpart(src varchar2, findstr varchar2 default ' ', nthpart integer default 1)
return varchar2 is
res varchar2(500) := findstr;
frompos integer := 1;
partlen integer := 0;
srcstr varchar2(501) := src||findstr;
begin
if nthpart = 1 then frompos := 1; partlen := instr(srcstr, findstr, 1, nthpart) - 1;
elsif nthpart < 1 then frompos := 1; partlen := 0;--length(srcstr);
elsif nthpart > 1 then
frompos := instr(srcstr, findstr, 1, nthpart - 1) + 1;
partlen := instr(srcstr, findstr, 1, nthpart) - instr(srcstr, findstr, 1, nthpart - 1) - 1;
end if;
res := substr(srcstr, frompos, partlen);
return res;
end w_func_getstrpart;
20070817
今天对函数作了一下修改,加上了分割符由多个组成的情况:
create or replace function w_func_getstrpart(src varchar2, findstr varchar2 default ' ', nthpart integer default 1)
return varchar2 is
res varchar2(500) := findstr;
frompos integer := 1;
partlen integer := 0;
srcstr varchar2(501) := src||findstr;
begin
if nthpart = 1 then frompos := 1; partlen := instr(srcstr, findstr, 1, nthpart) - 1;
elsif nthpart < 1 then frompos := 1; partlen := 0;--length(srcstr);
elsif nthpart > 1 then
frompos := instr(srcstr, findstr, 1, nthpart - 1) + length(findstr);
partlen := instr(srcstr, findstr, 1, nthpart) - instr(srcstr, findstr, 1, nthpart - 1) - length(findstr);
end if;
res := substr(srcstr, frompos, partlen);
return res;
end w_func_getstrpart;