I justed enfrentó un problema muy similar ... PERO RegExp_Count no lo pudo resolver. ¿Cuántas veces la cadena '16, 124,3,3,1,0, 'contiene', 3, '? Como vemos 2 veces, pero solo RegExp_Count Devoluciones en 1. Lo mismo es con '' bbaaaacc' y cuando se mira en él 'aa' - debe ser 3 veces y Devoluciones en RegExp_Count acaba 2.
select REGEXP_COUNT('336,14,3,3,11,0,' , ',3,') from dual;
select REGEXP_COUNT('bbaaaacc' , 'aa') from dual;
he perdido algo de tiempo para buscar soluciones en la web. No pude 'encontrar ... así que escribí mi propia función que devuelve el número VERDADERO de ocurrencia. Espero que sea útil.
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;
En cuanto al rendimiento que curiosamente encontró la solución 'REGEXP_COUNT' sea aproximadamente 5 veces más lenta (más tiempo de CPU que consume) que el' LONGITUD-LONGITUD (SUSTITUIR()) 'enfoque. Oracle 11.2.0.4 Linux x86 64-bit –