如何计算Oracle varchar值中字符出现次数?

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).

  • 这个答案很聪明;) (2认同)

Bor*_*din 61

REGEXP_COUNT应该可以解决问题:

select REGEXP_COUNT('123-345-566', '-') from dual;
Run Code Online (Sandbox Code Playgroud)

  • 仅支持Oracle 11. Nice解决方案. (4认同)

bpg*_*rgo 11

这是一个想法:尝试用空字符串替换不是破折号字符的所有内容.然后计算剩余的破折号数.

select length(regexp_replace('123-345-566', '[^-]', '')) from dual
Run Code Online (Sandbox Code Playgroud)


Grz*_*rzD 5

我刚刚遇到了非常类似的问题...但 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)

  • 正则表达式通过遍历字符串来工作,而不是每次从头开始搜索,因此“REGEXP_COUNT()”将始终正确地(从正则表达式的 POV)为您的示例以及类似的示例返回“1” 。它找到第一次出现的“,3,”,然后从字符串中的下一个位置开始,再次查找该模式,但没有找到。 (2认同)