解决方案 »

  1.   

    select str,sum(length(str))OVER(ORDER BY RN) CODE from (
    select REGEXP_SUBSTR(str, '[^1]*1', 1, LEVEL) STR,level RN
    from (select '10010001' str from dual)
    CONNECT BY LEVEL <= REGEXP_COUNT(str, '1') + 1
    )where str is not null
    执行结果
    STR    CODE
    1    1
    001  4
    0001 8
      

  2.   

    下面这个更简单
    select INSTR(str, '1', 1, LEVEL) STR
    from (select '10010001' str from dual)
    CONNECT BY LEVEL <= REGEXP_COUNT(str, '1')
    执行结果
    STR
    1
    4
    8
      

  3.   

    REGEXP_COUNT(str, '1')
    此函数11G之后可用,以前的版本可以替换成这样
    length(str)-length(replace(str,'1',''))
      

  4.   


    我的意思是在where语句里如何判断该字段的值是否包含某几个编码?你提供的这种方法好像不能满足我的需求:用户选择几个编码,从数据库中获取该字段包含这几个编码中的一个或者多个的所有记录。
      

  5.   

    利用REGEXP_LIKE吧
    里面的正则表达式根据你设定的几个编码生成
    假设制定3个code 分别为C1 C2 C3,正则表达式如下方式生成
    '^([0|1]{'||(C1-1)||'}|^[0|1]{'||(C2-1)||'}|^[0|1]{'||(C3-1)||'})1'
    下面语句是3个code为1、4、8时生成的正则表达式,只要包含其中一个就可以查出来
    select * from 你的表名
    WHERE REGEXP_LIKE(你的字段,'^([0|1]{0}|^[0|1]{3}|^[0|1]{7})1');
      

  6.   

    --编码表
    with codeconfig as(
    select rownum id, lpad('1',rownum,'0') value from dual
    connect by rownum<=20)
    --数据表
    ,t_data as(
    select '10010001' num from dual)select (select wm_concat(id) from codeconfig
    where regexp_like(t_data.num,'^'||replace(value,'0','(0|1)')) ) codes
    from t_data--是否包含编码4
    --编码表
    with codeconfig as(
    select rownum id, lpad('1',rownum,'0') value from dual
    connect by rownum<=20)
    --数据表
    ,t_data as(
    select '10010001' num from dual)select case when regexp_like(num,(
      select '^'||replace(x.value,'0','(0|1)')
      from codeconfig x where x.id=4)
    ) then '是' else '否' end flag from t_data