it-swarm.com.de

Wie zählt man die Anzahl der Vorkommen eines Zeichens in einem Oracle-Varchar-Wert?

Wie kann ich die Anzahl der Vorkommen des Zeichens - in einer varchar2-Zeichenfolge zählen?

Beispiel:

select XXX('123-345-566', '-') from dual;
----------------------------------------
2
30
Ula Krukar

Bitte schön:

select length('123-345-566') - length(replace('123-345-566','-',null)) 
from dual;

Wenn die zu prüfende Zeichenfolge nur das Zeichen enthält, das Sie zählen möchten, gibt die obige Abfrage NULL zurück. Die folgende Abfrage gibt in allen Fällen die richtige Antwort:

select coalesce(length('123-345-566') - length(replace('123-345-566','-',null)), length('123-345-566'), 0) 
from dual;

Die letzte 0 in coalesce erfasst den Fall, dass Sie in einer leeren Zeichenfolge zählen (d. H. NULL, weil length (NULL) = NULL in Oracle).

57
Flukey

REGEXP_COUNT sollte den Trick tun:

select REGEXP_COUNT('123-345-566', '-') from dual;
52
Borodin

Hier eine Idee: Versuchen Sie, alles, was kein Strichzeichen ist, durch einen leeren String zu ersetzen. Zählen Sie dann, wie viele Striche übrig sind.

select length(regexp_replace('123-345-566', '[^-]', '')) from dual
11
bpgergo

Ich dachte an

 SELECT LENGTH('123-345-566') - LENGTH(REPLACE('123-345-566', '-', '')) FROM DUAL;
3
Hugh Jones

Ich war gerade mit einem sehr ähnlichen Problem konfrontiert ... ABER RegExp_Count konnte es nicht beheben. Wie oft war der String '16, 124,3,3,1,0, 'enthält', 3 '? Wie wir 2 Mal sehen, gibt RegExp_Count jedoch nur 1 zurück. Dasselbe gilt für '' bbaaaacc 'und beim Anzeigen' aa '- sollte 3 Mal sein und RegExp_Count liefert nur 2.

select REGEXP_COUNT('336,14,3,3,11,0,' , ',3,') from dual;
select REGEXP_COUNT('bbaaaacc' , 'aa') from dual;

Ich habe etwas Zeit verloren, um im Web nach Lösungen zu suchen. Konnte nicht finden ... also habe ich meine eigene Funktion geschrieben, die die WAHRE Anzahl der Ereignisse zurückgibt. Ich hoffe es wird nützlich sein.

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;
3
GrzegorzD

hier ist eine Lösung, die sowohl für Zeichen als auch für Teilzeichenfolgen funktioniert:

select (length('a') - nvl(length(replace('a','b')),0)) / length('b')
  from dual

dabei ist a die Zeichenfolge, in der Sie das Vorkommen von b suchen

einen schönen Tag noch!

1
stefan

Sie können dies versuchen

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

es zählt "richtig" oslo für wie viele "aa" in "bba acc"

select count( distinct pos) from
(select instr('bbaaaacc', 'aa', level) as pos from dual
  connect by level <=length('bbaaaacc'))
where nvl(pos, 0) !=0
0
SELECT {FN LENGTH('123-345-566')} - {FN LENGTH({FN REPLACE('123-345-566', '#', '')})} FROM DUAL
0
Abel Pinto
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  ='_';
0
Kunal