Ula*_*kar 31 sql oracle count oracle10g
如何计算-varchar2字符串中出现的字符数?
例:
select XXX('123-345-566', '-') from dual;
----------------------------------------
2
Run Code Online (Sandbox Code Playgroud)
Flu*_*key 62
干得好:
select length('123-345-566') - length(replace('123-345-566','-',null))
from dual;
Run Code Online (Sandbox Code Playgroud)
从技术上讲,如果要检查的字符串仅包含要计数的字符,则上述查询将返回NULL; 以下查询将在所有情况下给出正确答案:
select coalesce(length('123-345-566') - length(replace('123-345-566','-',null)), length('123-345-566'), 0)
from dual;
Run Code Online (Sandbox Code Playgroud)
最后的0会coalesce捕获你在空字符串中计数的情况(即NULL,因为ORACLE中的长度(NULL)= NULL).
Bor*_*din 61
REGEXP_COUNT应该可以解决问题:
select REGEXP_COUNT('123-345-566', '-') from dual;
Run Code Online (Sandbox Code Playgroud)
bpg*_*rgo 11
这是一个想法:尝试用空字符串替换不是破折号字符的所有内容.然后计算剩余的破折号数.
select length(regexp_replace('123-345-566', '[^-]', '')) from dual
Run Code Online (Sandbox Code Playgroud)
我刚刚遇到了非常类似的问题...但 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;
Run Code Online (Sandbox Code Playgroud)
我花了一些时间在网上研究解决方案。找不到...所以我编写了自己的函数来返回真实的出现次数。希望它会有用。
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;
Run Code Online (Sandbox Code Playgroud)