복붙노트

[SQL] 어떻게 오라클 VARCHAR 값의 문자의 발생 수를 계산하려면?

SQL

어떻게 오라클 VARCHAR 값의 문자의 발생 수를 계산하려면?

VARCHAR2 문자열에 - 어떻게 문자의 발생 수를 계산 할 수 있습니까?

예:

select XXX('123-345-566', '-') from dual;
----------------------------------------
2

해결법

  1. ==============================

    1.여기 가서 :

    여기 가서 :

    select length('123-345-566') - length(replace('123-345-566','-',null)) 
    from dual;
    

    검사 할 문자열이 당신이 계산 할 경우에만 문자가 포함 된 경우 기술적으로, 위의 쿼리는 NULL을 반환합니다; 다음 쿼리는 모든 경우에 정확한 답을 줄 것이다 :

    select coalesce(length('123-345-566') - length(replace('123-345-566','-',null)), length('123-345-566'), 0) 
    from dual;
    

    유착의 마지막 0이 사건을 잡는다 어디 빈 문자열에있어 계수 (즉 NULL 때문에 길이 (NULL) = NULL ORACLE에서).

  2. ==============================

    2.REGEXP_COUNT 트릭을 수행해야합니다

    REGEXP_COUNT 트릭을 수행해야합니다

    select REGEXP_COUNT('123-345-566', '-') from dual;
    
  3. ==============================

    3.여기에 아이디어 : 빈 문자열과 대시 문자없는 시도 교체 다. 그런 다음 남아 얼마나 많은 대시를 계산합니다.

    여기에 아이디어 : 빈 문자열과 대시 문자없는 시도 교체 다. 그런 다음 남아 얼마나 많은 대시를 계산합니다.

    select length(regexp_replace('123-345-566', '[^-]', '')) from dual
    
  4. ==============================

    4.나는 매우 비슷한 문제에 직면로 재조정 ...하지만 RegExp_Count가 해결되지 수 있습니다. 몇 번이나 문자열 '16, 124,3,3,1,0, '3'포함 '? 우리는 2 번 볼 수 있지만 RegExp_Count은 1. 같은 일이 ''bbaaaacc '과'AA '에서 찾고있다 반환으로 - 3 회 RegExp_Count 반환 단지이 있어야한다.

    나는 매우 비슷한 문제에 직면로 재조정 ...하지만 RegExp_Count가 해결되지 수 있습니다. 몇 번이나 문자열 '16, 124,3,3,1,0, '3'포함 '? 우리는 2 번 볼 수 있지만 RegExp_Count은 1. 같은 일이 ''bbaaaacc '과'AA '에서 찾고있다 반환으로 - 3 회 RegExp_Count 반환 단지이 있어야한다.

    select REGEXP_COUNT('336,14,3,3,11,0,' , ',3,') from dual;
    select REGEXP_COUNT('bbaaaacc' , 'aa') from dual;
    

    나는 웹 솔루션을 연구하는 시간을 잃었다. 난 내 자신의 기능을 썼다 '을 (를) 찾을 수 없습니다 ... 그래서 occurance의 반환 TRUE 수. 이 유용 할 것이다 바랍니다.

    CREATE OR REPLACE FUNCTION EXPRESSION_COUNT( pEXPRESSION VARCHAR2, pPHRASE VARCHAR2 ) RETURN NUMBER AS
      vRET NUMBER := 0;
      vPHRASE_LENGTH NUMBER := 0;
      vCOUNTER NUMBER := 0;
      vEXPRESSION VARCHAR2(4000);
      vTEMP VARCHAR2(4000);
    BEGIN
      vEXPRESSION := pEXPRESSION;
      vPHRASE_LENGTH := LENGTH( pPHRASE );
      LOOP
        vCOUNTER := vCOUNTER + 1;
        vTEMP := SUBSTR( vEXPRESSION, 1, vPHRASE_LENGTH);
        IF (vTEMP = pPHRASE) THEN        
            vRET := vRET + 1;
        END IF;
        vEXPRESSION := SUBSTR( vEXPRESSION, 2, LENGTH( vEXPRESSION ) - 1);
      EXIT WHEN ( LENGTH( vEXPRESSION ) = 0 ) OR (vEXPRESSION IS NULL);
      END LOOP;
      RETURN vRET;
    END;
    
  5. ==============================

    5.나는 생각

    나는 생각

     SELECT LENGTH('123-345-566') - LENGTH(REPLACE('123-345-566', '-', '')) FROM DUAL;
    
  6. ==============================

    6.여기에 문자와 문자열 모두를 위해 작동하는 솔루션입니다 :

    여기에 문자와 문자열 모두를 위해 작동하는 솔루션입니다 :

    select (length('a') - nvl(length(replace('a','b')),0)) / length('b')
      from dual
    

    어디는 B의 발생을 검색하는 문자열입니다

    멋진 일이!

  7. ==============================

    7.

    SELECT {FN LENGTH('123-345-566')} - {FN LENGTH({FN REPLACE('123-345-566', '#', '')})} FROM DUAL
    
  8. ==============================

    8.

    select count(*)
    from (
          select substr('K_u_n_a_l',level,1) str
          from dual
          connect by level <=length('K_u_n_a_l')
         )
    where str  ='_';
    
  9. ==============================

    9.이 시도 할 수 있습니다

    이 시도 할 수 있습니다

    select count( distinct pos) from
    (select instr('123-456-789', '-', level) as pos from dual
      connect by level <=length('123-456-789'))
    where nvl(pos, 0) !=0
    

    그것은 얼마나 많은 'AA'에서 'BBA ACC'에 대한 "제대로"오슬로를 계산

    select count( distinct pos) from
    (select instr('bbaaaacc', 'aa', level) as pos from dual
      connect by level <=length('bbaaaacc'))
    where nvl(pos, 0) !=0
    
  10. from https://stackoverflow.com/questions/8169471/how-to-count-the-number-of-occurrences-of-a-character-in-an-oracle-varchar-value by cc-by-sa and MIT license