繁体   English   中英

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

[英]How to count the number of occurrences of a character in an Oracle varchar value?

我怎么能算的字符出现的次数-在一个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 捕捉您在空字符串中计数的情况(即 NULL,因为在 ORACLE 中 length(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;

我失去了一些时间来研究网络上的解决方案。 找不到……所以我写了自己的函数来返回真实的出现次数。 希望它会很有用。

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 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”

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 (length('a') - nvl(length(replace('a','b')),0)) / length('b')
  from dual

其中 a 是您在其中搜索 b 出现的字符串

祝你今天过得愉快!

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  ='_';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM