Varchar2文字列で文字-
の出現回数をカウントするにはどうすればよいですか?
例:
select XXX('123-345-566', '-') from dual;
----------------------------------------
2
どうぞ:
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)でカウントしているケースをキャッチします。
REGEXP_COUNT トリックを行う必要があります:
select REGEXP_COUNT('123-345-566', '-') from dual;
ここにアイデアがあります:ダッシュ文字以外のすべてを空の文字列で置き換えてみてください。次に、ダッシュの数を数えます。
select length(regexp_replace('123-345-566', '[^-]', '')) from dual
私は非常によく似た問題に直面しました...しかし、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;
と思った
SELECT LENGTH('123-345-566') - LENGTH(REPLACE('123-345-566', '-', '')) FROM DUAL;
文字と部分文字列の両方で機能するソリューションを次に示します。
select (length('a') - nvl(length(replace('a','b')),0)) / length('b')
from dual
ここで、aはbの出現を検索する文字列です
ごきげんよう!
これを試すことができます
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
SELECT {FN LENGTH('123-345-566')} - {FN LENGTH({FN REPLACE('123-345-566', '#', '')})} FROM DUAL
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 ='_';