web-dev-qa-db-ja.com

Oracle varchar値内の文字の出現回数をカウントする方法は?

Varchar2文字列で文字-の出現回数をカウントするにはどうすればよいですか?

例:

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

どうぞ:

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;

coalesceの最後の0は、空の文字列(Oracleではlength(NULL)= NULLであるため、NULL)でカウントしているケースをキャッチします。

60
Flukey

REGEXP_COUNT トリックを行う必要があります:

select REGEXP_COUNT('123-345-566', '-') from dual;
59
Borodin

ここにアイデアがあります:ダッシュ文字以外のすべてを空の文字列で置き換えてみてください。次に、ダッシュの数を数えます。

select length(regexp_replace('123-345-566', '[^-]', '')) from dual
11
bpgergo

私は非常によく似た問題に直面しました...しかし、RegExp_Countはそれを解決できませんでした。文字列「16,124,3,3,1,0、」に「、3、」が含まれる回数2回表示されますが、RegExp_Countは1だけを返します。同じことは '' bbaaaacc 'であり、それを見ると' aa '-3回で、RegExp_Countは2だけを返します。

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

Webでソリューションを研究するための時間を失いました。見つけることができませんでした...だから、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;
4
GrzegorzD

と思った

 SELECT LENGTH('123-345-566') - LENGTH(REPLACE('123-345-566', '-', '')) FROM DUAL;
3
Hugh Jones

文字と部分文字列の両方で機能するソリューションを次に示します。

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

ここで、aはbの出現を検索する文字列です

ごきげんよう!

1
stefan

これを試すことができます

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

「bbaaaacc」に「aa」がいくつあるかについて「適切に」olsoをカウントします

select count( distinct pos) from
(select instr('bbaaaacc', 'aa', level) as pos from dual
  connect by level <=length('bbaaaacc'))
where nvl(pos, 0) !=0
0
SELECT {FN LENGTH('123-345-566')} - {FN LENGTH({FN REPLACE('123-345-566', '#', '')})} FROM DUAL
0
Abel Pinto
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  ='_';
0
Kunal