问题是这样的,我得到一个字符串,3c,有两个栏位里有如下信息3a,3b,3c,11,12,13,4a,4b,4c,另一个栏位里是1,2,3,4,5,6,7,8,9
也就是说通过字符串3c找到栏位一里3c对应的,号在第几个位置上,然后在第二个栏位里取该位置,号前的字符串,我想了一下用instr取到的位置不准,不知道应该怎么弄,大侠指点一下!!

解决方案 »

  1.   

    是不是这样
    with tt as(select '3a,2bad,ada,4ad,232a,' col1,'2,3,4,1,5' col2 from dual)select substr(col2,1,instr(col2,',',1,length(substr(col1,1,instr(col1,'ada')))
      -length(replace(substr(col1,1,instr(col1,'ada')),','))+1)-1) 
    from tt
      

  2.   

    自己解决了,
    select 'aa', substr('1,2,3', trunc(instr('aa,bb,cc', 'aa')/3) * 2 + 1, 1), 'aa,bb,cc'
      from dual;
    看看高手们有没有更加好的办法,第一个字串逗号直接是两个字符,第二个字串逗号之间是一个字符,
    就是如上所示的,aa要求转换成1,先找到'aa,bb,cc'中'aa'逗号的位置,再找'1,2,3'中这个顺序的逗号对应的值.
    测试是可以的,aa变成1,bb变成2,cc变成3
    有点麻烦,期待高手有更加好的办法解决!!
    TKS!!
      

  3.   

    SQL> select substr('1C2C3C4C5C6C7C8C9 ',2*a-1,1) b from(
      2  select ceil(to_number(instr(('3a,3b,3c,11,12,13,4a,4b,4c'),'3c',1,1))/3) a from dual
      3  );B
    -
    3
      

  4.   

    如果是的话你的基本上已经是最优化的了
    trunc可以去掉,把里面instr的值减一即可
      

  5.   

    呵呵 红色部分变成乱码了
    substr('1,2,3,4,5,6,7,8,9',2*a-1,1);
      

  6.   

    with tt as(select '3a,2bad,ada,4ad,232a,' col1,'232,42,14,31,45' col2 from dual)select substr(col2,instr(col2,',',1,instr(col1,'4ad')-length(replace(substr(col1,1,instr(col1,'4ad')),',')))+1,
                  instr(col2,',',1,instr(col1,'4ad')-length(replace(substr(col1,1,instr(col1,'4ad')),','))+1)-
                  instr(col2,',',1,instr(col1,'4ad')-length(replace(substr(col1,1,instr(col1,'4ad')),',')))-1)
    from tt这个可以实现。我再想办法简化
    什么版本的数据库?
      

  7.   

    写个procedure,按逗号就行截取 再一个个比较 没什么难度 就是有点麻烦
      

  8.   

    这个是不是有规律,都是两位相隔呢?'3a,3b,3c,11,12,13,4a,4b,4c'??
      

  9.   

    如是两位数的话,是有规律的!
    可以用以下的操作:select distinct a,trunc((b/3)+1) b from
    (
     select  substr(a,mod(rownum,3)*rownum,2) a,
      mod(rownum,3)*rownum b from
      (
             select  '3a,3b,3c,11,12,13,4a,4b,4c' a from dual
      )
      connect by rownum<length(a)
    ) where b<>0 and a is not null
    --and a='3c'
    order by b--result:3a 1
    3b 2
    3c 3
    11 4
    12 5
    13 6
    4a 7
    4b 8
    4c 9
      

  10.   

    10g的可以用正则with tt as(select '3a,2bad,ada,4ad,232a,' col1,'232,42,14,31,45' col2 from dual)select regexp_substr(col2,'[[:digit:]]+',1,instr(','||col1,','||'4ad'||',')-length(replace(substr(col1,1,instr(','||col1,','||'4ad'||',')),','))+1)          
    from tt在要查询的值两端加上','比较保险
      

  11.   

    写了一个不管中间有多少个字符的,位数不固定的!select case when c=0 then substr(a,b+1,length(a)-1) else substr(a,b+1,c-b-1) end  b,rownum from
    (
          select a,b,
          nvl(lead(b) over(partition by a order by b),0) c,
          lag(b) over(partition by a order by b) d
          from
          (
            select distinct a, instr(a,',',rownum) b
            from
              (
                     select  '3a,3b3,3c,11,12,11111113,4a111,114b,4c' a from dual
              )
              connect by rownum<length(a)
          )
    )
    --result:3a 1
    3b3 2
    3c 3
    11 4
    12 5
    11111113 6
    4a111 7
    114b 8
    4c 9