在oracle中如何得到一个字符串在另一个字符串出现的次数

解决方案 »

  1.   

    select length('asdfsdfasdf')-length(replace('asdfsdfasdf','d','')) xxx 
    from dual;
      

  2.   

    楼上的做法有点问题:当'd'是多个字符的长度时就不行了。select (length('asdfsdfasdf')-length(replace('asdfsdfasdf','d',''))) / length('d') xxx from dual; 
      

  3.   

    谢谢各位啦,我又有一个新的需求,已加分
    select instr('000111111111','1') from dual;
    我想把上面字符串'000111111111'中1的位置都记录到一个字段中,怎么弄呢
      

  4.   


    为什么不行啊。select (length('asdfsdfasdf')-length(replace('asdfsdfasdf','asd',''))) / length('asd') xxx from dual; 结果不是2吗?
      

  5.   

    我是想得到这样一个结果
    select instr('000111111111','1') from dual; 4#5#6#7#8#9#10#11#12
      

  6.   

    select substr(max(sys_connect_by_path(val, '#')),2) path
      from (select decode(substr('000111111111', b.rid, 1), '1', b.rid, 0) val,
                   b.rid,
                   b.rid - 1 pid
              from dual a,
                   (select rownum rid
                      from dual
                    connect by rownum <= length('000111111111')) b
             where decode(substr('000111111111', b.rid, 1), '1', b.rid, 0) > 0)
     start with rid = instr('000111111111', '1')
    connect by prior rid = pid;PATH
    -----------------------------------
    4#5#6#7#8#9#10#11#12
      

  7.   

    自己写函数也不错:CREATE OR REPLACE FUNCTION get_position(p_str varchar2, p_substr varchar2) 
    RETURN VARCHAR2
    AS
       l_str      VARCHAR2(1000);
       l_count    NUMBER(4) := 1;
    begin
      
      FOR i IN 1..LENGTH(p_str) LOOP
        SELECT INSTR(p_str, p_substr, l_count)
          INTO l_count
          FROM DUAL;  IF l_count = 0 THEN
        EXIT;
      END IF;
      l_str := l_str || '#' ||l_count;  l_count := l_count + 1;  END LOOP;
      RETURN l_str;
    END;
    /