Kategorien:

Zeichenfolgenfunktionen (reguläre Ausdrücke)

REGEXP_COUNT

Gibt zurück, wie oft ein Muster in einer Zeichenfolge vorkommt.

Syntax

REGEXP_COUNT( <subject> ,
              <pattern>
                [ , <position>
                  [ , <parameters> ]
                ]
)
Copy

Argumente

Benötigt:

subject

Die Zeichenfolge, nach der gesucht werden soll.

pattern

Abzugleichendes Muster.

Richtlinien zur Angabe von Mustern finden Sie unter Zeichenfolgenfunktionen (reguläre Ausdrücke).

Optional:

position

Anzahl der Zeichen ab dem Anfang der Zeichenfolge, an dem die Funktion mit der Suche nach Übereinstimmungen beginnt.

Standard: 1 (die Suche nach einer Übereinstimmung beginnt beim ersten Zeichen links)

parameters

Zeichenfolge aus einem oder mehreren Zeichen, in der die Parameter angegeben sind, die zur Suche nach Übereinstimmungen verwendet werden. Unterstützte Werte:

Parameter

Beschreibung

c

Abgleich, bei dem zwischen Groß- und Kleinschreibung unterschieden wird

i

Abgleich ohne Berücksichtigung der Groß-/Kleinschreibung

m

Mehrzeiliger Modus.

e

Untergeordnete Übereinstimmungen extrahieren

s

POSIX-Platzhalterzeichen . im einzeiligen Modus stimmt mit \n überein

Standard: c

Weitere Details dazu finden Sie unter Angeben der Parameter für reguläre Ausdrücke.

Rückgabewerte

Gibt einen Wert vom Typ NUMBER zurück. Gibt NULL zurück, wenn ein Argument NULL ist.

Nutzungshinweise

Siehe Allgemeine Nutzungshinweise für Funktionen für reguläre Ausdrücke.

Sortierungsdetails

Arguments with collation specifications currently aren’t supported.

Beispiele

Im folgenden Beispiel wird das Vorkommen des Worts was gezählt. Sie können das \b -Metazeichen verwenden, um eine Wortgrenze anzugeben. Im folgenden Beispiel beginnt der Abgleich mit dem ersten Zeichen in der Zeichenfolge w und endet mit dem letzten Zeichen in der Zeichenfolge s``und stimmt daher nicht mit Wörtern überein, die die Zeichenfolge enthalten (z. B. ``washing):

SELECT REGEXP_COUNT('It was the best of times, it was the worst of times',
                    '\\bwas\\b',
                    1) AS result;
Copy
+--------+
| RESULT |
|--------|
|      2 |
+--------+

Im folgenden Beispiel wird der i-Parameter verwendet, um das Zeichen e abzugleichen, ohne dass die Groß- und Kleinschreibung berücksichtigt wird:

SELECT REGEXP_COUNT('Excelence', 'e', 1, 'i') AS e_in_excelence;
Copy
+----------------+
| E_IN_EXCELENCE |
|----------------|
|              4 |
+----------------+

Im folgenden Beispiel werden sich überlappende Vorkommen veranschaulicht: Erstellen Sie eine Tabelle, und fügen Sie Daten ein:

CREATE OR REPLACE TABLE overlap (id NUMBER, a STRING);
INSERT INTO overlap VALUES (1,',abc,def,ghi,jkl,');
INSERT INTO overlap VALUES (2,',abc,,def,,ghi,,jkl,');

SELECT * FROM overlap;
Copy
+----+----------------------+
| ID | A                    |
|----+----------------------|
|  1 | ,abc,def,ghi,jkl,    |
|  2 | ,abc,,def,,ghi,,jkl, |
+----+----------------------+

Führen Sie eine Abfrage aus, die REGEXP_COUNT verwendet, um zu zählen, wie oft das folgende Muster in jeder Zeile vorkommt: ein Satzzeichen gefolgt von Ziffern und Buchstaben, gefolgt von einem Satzzeichen.

SELECT id,
       REGEXP_COUNT(a,
                    '[[:punct:]][[:alnum:]]+[[:punct:]]',
                    1,
                    'i') AS result
  FROM overlap;
Copy
+----+--------+
| ID | RESULT |
|----+--------|
|  1 |      2 |
|  2 |      4 |
+----+--------+

Die übrigen Beispiele verwenden die Daten in der folgenden Tabelle:

CREATE OR REPLACE TABLE regexp_count_demo (dt DATE, messages VARCHAR);

INSERT INTO regexp_count_demo (dt, messages) VALUES
  ('10-AUG-2025','ER-6842,LG-230,LG-150,ER-3379,ER-6210'),
  ('11-AUG-2025','LG-272,LG-605,LG-683,ER-5577'),
  ('12-AUG-2025','ER-2207,LG-551,LG-826,ER-6842');

SELECT * FROM regexp_count_demo;
Copy
+------------+---------------------------------------+
| DT         | MESSAGES                              |
|------------+---------------------------------------|
| 2025-08-10 | ER-6842,LG-230,LG-150,ER-3379,ER-6210 |
| 2025-08-11 | LG-272,LG-605,LG-683,ER-5577          |
| 2025-08-12 | ER-2207,LG-551,LG-826,ER-6842         |
+------------+---------------------------------------+

Die folgende Abfrage gibt die Gesamtzahl der Nachrichten für jeden Tag zurück, indem sie nach dem Trennzeichen (,) sucht und Eins zur Gesamtsumme hinzufügt:

SELECT dt,
       REGEXP_COUNT(messages, ',') + 1 AS message_count
  FROM regexp_count_demo;
Copy
+------------+---------------+
| DT         | MESSAGE_COUNT |
|------------+---------------|
| 2025-08-10 |             5 |
| 2025-08-11 |             4 |
| 2025-08-12 |             4 |
+------------+---------------+

Angenommen, Fehler beginnen immer mit ER, gefolgt von einem Bindestrich und einer vierstelligen Zahl. Die folgende Abfrage zählt die Anzahl der Fehler für jeden Tag:

SELECT dt,
       REGEXP_COUNT(messages, '\\bER-[0-9]{4}') AS number_of_errors
  FROM regexp_count_demo;
Copy
+------------+------------------+
| DT         | NUMBER_OF_ERRORS |
|------------+------------------|
| 2025-08-10 |                3 |
| 2025-08-11 |                1 |
| 2025-08-12 |                2 |
+------------+------------------+