- Kategorien:
REGEXP_COUNT¶
Gibt zurück, wie oft ein Muster in einer Zeichenfolge vorkommt.
Syntax¶
REGEXP_COUNT( <subject> ,
<pattern>
[ , <position>
[ , <parameters> ]
]
)
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
übereinStandard:
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;
+--------+
| 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;
+----------------+
| 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;
+----+----------------------+
| 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;
+----+--------+
| 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;
+------------+---------------------------------------+
| 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;
+------------+---------------+
| 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;
+------------+------------------+
| DT | NUMBER_OF_ERRORS |
|------------+------------------|
| 2025-08-10 | 3 |
| 2025-08-11 | 1 |
| 2025-08-12 | 2 |
+------------+------------------+