table表的cell字段内容全部类似为:aaaa,bbbb,cccc,ddddd。值之间用“,”分隔分开,分隔符前后的字符长度灵活变化,请问怎么查询出在“aaaa,bbbb,cccc,ddddd”范围内的所有记录啊

解决方案 »

  1.   

    “aaaa,bbbb,cccc,ddddd”范围内是什么意思
      

  2.   

    create or replace function split_str(var_str   in varchar2,
                                           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;
      

  3.   

    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
      

  4.   

    我的意思是cell字段中的值是任意,不光只是字母:如:23132,434abc,gf33。
      

  5.   

    谢谢大解的帮助,请问有没有详细的SQL语句查询,因为要用在程序中用,不可能为了查询再创建一个新的表,谢谢了
      

  6.   

    你试试我上面的代码,其中的那个子查询需要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) 
    只是测试用的数据,你可以将这段去掉
      

  7.   

    如果是在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)
      

  8.   

    。。不能用connect by rownum<..
    因为源表中记录不会只有一条
      

  9.   

    如果是拆一列的值的话,就这样~
    SELECT 列名
      FROM (
    SELECT REGEXP_SUBSTR(列名,'[^'||','||']+',1,rn) as 列名
      FROM 表名,
           (SELECT rownum rn FROM dual connect by rownum <= 10000) c
    )
    WHERE 列名 IS NOT NULL
      

  10.   

    汗..那不就是我用的方法了
    不用regexp也可以