Tôi vừa gặp phải vấn đề rất giống nhau ... NHƯNG RegExp_Count không thể giải quyết được. Chuỗi bao nhiêu lần '16, 124,3,3,1,0, 'chứa', 3, '? Như chúng ta thấy 2 lần, nhưng RegExp_Count trả về chỉ 1. Cùng một điều là với '' bbaaaacc' và khi nhìn vào nó 'aa' - nên 3 lần và RegExp_Count trả về chỉ 2.
select REGEXP_COUNT('336,14,3,3,11,0,' , ',3,') from dual;
select REGEXP_COUNT('bbaaaacc' , 'aa') from dual;
tôi bị mất một số thời gian để nghiên cứu giải pháp trên web. Không thể 'tìm thấy ... vì vậy tôi đã viết hàm của riêng tôi trả về số lượng TRUE của sự xuất hiện. Hy vọng nó sẽ hữu ích.
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;
Về hiệu suất, chúng tôi đã tìm thấy giải pháp 'REGEXP_COUNT' chậm hơn khoảng 5 lần (tốn nhiều thời gian hơn CPU) so với phương pháp' LENGTH-LENGTH (REPLACE()) '. Oracle 11.2.0.4 Linux x86 64-bit –