一个字符串由0,1组成,
0010101001010101010100111101010101010000011101
想知道最长的连续的1有多少个
比如0010101001010101010100111101010101010000011101
最长的续的1是:1111

解决方案 »

  1.   


    select 字符串, max(连续1) from (
    select '0010101001010101010100111101010101010000011101' "字符串",
    regexp_substr('0010101001010101010100111101010101010000011101', '1{'|| (level) ||'}') "连续1"
    from dual
    connect by level < length('0010101001010101010100111101010101010000011101')
    ) group by 字符串;字符串                                                MAX(连续1)
    ---------------------------------------------- ---------------------------
    0010101001010101010100111101010101010000011101 1111
      

  2.   

    SQL> select * from t_find;
     
    STR
    --------------------------------------------------------------------------------
    0010101001010101010100111101010101010000011101
     
    SQL> 
    SQL> with t1 as (select rownum rn from dual connect by rownum<(select max(length(str))+2 from t_find)),
      2  t2 as (select substr( str ,instr(str,'0',1,rn)+1,instr(str,'0',1,rn+1)-instr(str,'0',1,rn)-1) str from t_find,t1)
      3  select max(str) from t2
      4  ;
     
    MAX(STR)
    --------------------------------------------------------------------------------
    1111
     
    SQL> 
      

  3.   

    10g以上版本才支持正则表达式regexp_substr
      

  4.   

    用这个,上面那个当最长的串在开头或者结尾的时候有bug
    SQL> with t1 as (select rownum rn from dual connect by rownum<(select max(length(str))+2 from t_find)),
      2  t2 as (select substr( '0'||str||'0' ,instr('0'||str||'0','0',1,rn)+1,instr('0'||str||'0','0',1,rn+1)-instr('0'||str||'0','0',1,rn)-1) str from t_find,t1)
      3  select max(str) from t2;
     
    MAX(STR)
    --------------------------------------------------------------------------------
    1111
     
    SQL> 
      

  5.   

    with t as (
    select '001010100101101010101001111101010101010000011101' as id
      from dual
    union all
    select '00101010010101010101001111010101010100000111011' from dual) 
    select id , max(length(l1.l)) ,max(l1.l)
     from t 
       join ( 
      select substr('11111111111111111111111111',1,level) l from dual connect by level < length('11111111111111111111111111')) l1
      on t.id like '%'||l1.l || '%'
      group by id  
      
      最容易理解滴.
      

  6.   

    with t as (
    select '001010100101101010101001111101010101010000011101' as id
      from dual
    union all
    select '00101010010101010101001111010101010100000111011' from dual)  
    select id , max(length(l1.l)) ,max(l1.l)
     from t  
      join (  
      select substr('11111111111111111111111111',1,level) l from dual connect by level < length('11111111111111111111111111')) l1
      on t.id like '%'||l1.l || '%'
      group by id   
       
      最容易理解滴.
      

  7.   

    谢谢!谢谢!请问:regexp_substr('0010101001010101010100111101010101010000011101', '1{'|| (level) ||'}'
    这个是什么语法意思呢?
      

  8.   

    就是在'0010101001010101010100111101010101010000011101'中,用正则表达式1{1}, 1{2}, 1{3}, ..., 1{level}来匹配;1{1}表示1个1, 1{2}表示连续两个1,如此类推。