with tt as(select 'aaaa,bbbb,cccc,dddd' a from dual union all select 'eeee,ffff' from dual)select substr(a.a,instr(','||a.a,',',1,b.rn),instr(a.a||',',',',1,b.rn)-instr(','||a.a,',',1,b.rn))a from tt a, (select rownum rn from dual connect by rownum<10)b where length(a.a)-length(replace(a.a,','))+1>=rn
你试试我上面的代码,其中的那个子查询需要10g以上的版本的支持 字母和数字没关系,根据逗号来分割 rownum <10根据每个值中字符串的数目来设定,比如这个字段中'adbc,daf,cafd,daf'可能的最大数目为8,则改成rownum<9with tt as(select 'aaaa,bbbb,cccc,dddd' a from dual union all select 'eeee,ffff' from dual) 只是测试用的数据,你可以将这段去掉
如果是在10G下,可以用正则先拆分,再查询~ select regexp_substr('899,369,58,369,48', '([^,]+)', 1, rownum) str from dual connect by rownum < (length(regexp_replace('899,369,58,369,48', '[^,]', '')) + 2)
。。不能用connect by rownum<.. 因为源表中记录不会只有一条
如果是拆一列的值的话,就这样~ SELECT 列名 FROM ( SELECT REGEXP_SUBSTR(列名,'[^'||','||']+',1,rn) as 列名 FROM 表名, (SELECT rownum rn FROM dual connect by rownum <= 10000) c ) WHERE 列名 IS NOT NULL
var_split in varchar2)
/****************************************************
注意 先执行下面语句 创建类型
create or replace type t_ret_table is table of varchar2(100) ** 函数名称:split_str ** 参 数:【名称】 【类型 】 【说明】
** var_str varchar2 要拆分的字符串
** var_split varchar2 字符串分隔符
** 返 回 值:Result t_ret_table 拆分后数组集合
** 摘 要:拆分字符串
调用 举例:
select * from table(split_str('2008-10-21','-'))
****************************************************/
return t_ret_table is var_out t_ret_table;
var_tmp varchar2(4000);
var_element varchar2(4000);begin
var_tmp := var_str;
var_out := t_ret_table();
--如果存在匹配的分割符
while instr(var_tmp, var_split) > 0 loop
var_element := substr(var_tmp, 1, instr(var_tmp, var_split) - 1);
var_tmp := substr(var_tmp,
instr(var_tmp, var_split) + length(var_split),
length(var_tmp));
--var_out.extend(1);
var_out.extend;
var_out(var_out.count) := var_element;
end loop; --var_out.extend(1);
var_out.extend;
var_out(var_out.count) := var_tmp; return var_out;
end split_str;
union all select 'eeee,ffff' from dual)select substr(a.a,instr(','||a.a,',',1,b.rn),instr(a.a||',',',',1,b.rn)-instr(','||a.a,',',1,b.rn))a
from
tt a,
(select rownum rn from dual connect by rownum<10)b
where length(a.a)-length(replace(a.a,','))+1>=rn
字母和数字没关系,根据逗号来分割
rownum <10根据每个值中字符串的数目来设定,比如这个字段中'adbc,daf,cafd,daf'可能的最大数目为8,则改成rownum<9with tt as(select 'aaaa,bbbb,cccc,dddd' a from dual
union all select 'eeee,ffff' from dual)
只是测试用的数据,你可以将这段去掉
select regexp_substr('899,369,58,369,48', '([^,]+)', 1, rownum) str
from dual
connect by rownum <
(length(regexp_replace('899,369,58,369,48', '[^,]', '')) + 2)
因为源表中记录不会只有一条
SELECT 列名
FROM (
SELECT REGEXP_SUBSTR(列名,'[^'||','||']+',1,rn) as 列名
FROM 表名,
(SELECT rownum rn FROM dual connect by rownum <= 10000) c
)
WHERE 列名 IS NOT NULL
不用regexp也可以