oracle中字符串分割函数现实
额..悲剧了.真的是悲剧了.
有这么一个问题被问到了,"表中某个字段的值是用分号隔开的,我要分别取出来,SQL怎么写啊?".我开始没怎么注意,以为很是容易.心想oracle这个死贵但又牛比的产品肯定会提供现成的方法来处理这样的用户需求,就回复给人说:"使用oracle的字符串分隔函数".还信誓旦旦的要写个例子出来.原本以为几分钟的事情,但是..杯具接着就来了.没有现成的函数,我擦...郁闷..没面子啊....羞愧难当啊.上面是题外话,也顺便说明了我这个问题的由来.如何解决呢?本着大哥一贯的做事风格..必须解决之...
由于对oracle了解十分有限,很多功能特性都没有时间耐下心来研读(真是罪过啊~~)自己写还是很费时的,憋了一会没憋出来.只有google了.找了个能够满足需求的例子,分析一下就能够满足需要了.
实现如下:
--创建一个type,便于在后面自定义的split函数中使用
create or replace type type_split as table of varchar2(500);
--创建自定义函数split,
--本函数包含两个参数变量p_list需要处理的字符串,和p_sep分隔符
--函数返回类型为上面自定义的type_split,
--使用pipelined 的function为了提高效率,不用等所有的数据都处理完成了才返回客户端,它是边处理边返回.适用于大数据量的交互
--逻辑:循环需要处理的字符串v_list,每次循环获取分隔符的位置,根据位置截取v_list,推出循环的条件是:需要处理的字符串v_list中已经没有分隔符存在(这个逻辑是否跟java中string里面的split()一样呢?这个问题有待验证啊...还是高级语言好使啊 高效啊~~)
create or replace function split
(
p_list varchar2,
p_sep varchar2 := ';'
) return type_split pipelined
is
l_idx pls_integer;
v_list varchar2(500) := p_list;
begin
loop
l_idx := instr(v_list,p_sep);
if l_idx > 0 then
pipe row(substr(v_list,1,l_idx-1));
v_list := substr(v_list,l_idx+length(p_sep));
else
pipe row(v_list);
exit;
end if;
end loop;
return;
end split;
--测试 语句
select * from table(split('121212;dfd;dfd;vvv;llll;对方答复',';'));
从问题的角度来说 上面已经解决了.但从这事情来看,我还是暴漏了很多的不足.知识盲点总会是有的.但遇到知识盲点采取何种策略解决,很明显目前我拥有的解决方案不尽如人意啊.这点还需加强一下.具体该如何做呢?马上就下班了 刚好趁着这个点总结一下,哄哄~~.最重要的一点:学会解决问题,妈呀 这个话太大了..自己说出来都有些害怕.哈哈,还是需要静心,仔细的 不急不躁的一点点的解决,写程序嘛.就要耐得住性子.还应该做到多思考,长琢磨.这点就不说了,要不然真的成为码农了.最后又时间 要多看书,从更加宏观的方法去把握技术的体系,要有一个坚实的理论基础才行呢.就先写这么多吧.