清洗数据需要将某个字段内以空格分隔的字符串拆分成多行单个的字符串,百度了很多种方法大概归结起来也就这几种方法最为有效,现在把贴出来:
第一种:
select regexp_substr('1 2 3','[^ ]+',1,level,'i') from dual
connect by level <= length('1 2 3') -length(regexp_replace('1 2 3',' ',''))+1;
效果就是这个样子↓
效果
这种方法的核心就是regexp_substr函数,通过正则来拆分字符串,函数用法为:
regexp_substr(str,进行匹配的正则表达式,position,标志第几个匹配组,modifier)。
该函数的一个缺点就是只能每次取一个字符串出来,这个就比较头痛了,因为现在我要取分割后所有的字符串,所以现在就要用到connect by命令,来限制取几个匹配组,当然我们是要全部的,所以就通过length来实时确定所取得匹配组数量。
通过这种方法就可以实现开题的需求,但在用的过程中发现一个问题,如果说我要给拆分后的字符串带上ID的话这种方法就貌似失灵了,会无限次取,所以问题没解决,有人知道的话麻烦可以告诉我一下。
第二种
1 create or replace function split(p_list varchar,p_sep varchar := ' ')两个参数,一个实传入字符串名,第二个是根据什么来分割 2 3 return type_split pipelined 4 5 IS 6 7 l_idx pls_integer; 8 9 v_list varchar2(50) := p_list; 10 11 begin 12 13 loop 14 15