Reguläre Ausdrücke können nun auch als Bedingung und Zähler verwendet werden.
Invantive UniversalSQL wurde um die SQL-Funktionen regexp_like und regexp_count erweitert. Damit ist die Sammlung der regulären Ausdrucksfunktionen komplett: Neben regexp_instr, regexp_replace und regexp_substr beantwortet regexp_like die Frage, ob ein Muster vorkommt, und regexp_count zählt, wie oft es vorkommt.
regexp_like
Die Funktion regexp_like beantwortet, ob ein Muster in einem Wert vorkommt. Die Form lautet:
regexp_like(wert, muster [, startposition [, match_parameter]])
Die Antwort ist true, wenn das Muster vorkommt, und false, wenn dies nicht der Fall ist. Ist der Wert oder das Muster leer, ist die Antwort leer. Die Funktion ist für eine where-Klausel gedacht, darf aber auch als Spalte in einem select verwendet werden.
regexp_count
Die Funktion regexp_count zählt, wie oft ein Muster in einem Wert vorkommt. Die Form lautet:
regexp_count(wert, muster [, startposition [, match_parameter]])
Die Antwort ist 0, wenn das Muster nicht vorkommt, und leer, wenn der Wert oder das Muster leer ist. Die Vorkommen überlappen sich nicht: Die Suche nach dem nächsten Vorkommen setzt nach dem Ende des vorherigen fort. So kommt aa einmal in aaa vor und nicht zweimal.
Startposition und match_parameter
Beide Funktionen haben die gleichen zwei optionalen Parameter. Die Startposition zählt ab 1 und ist standardmäßig 1; die Suche beginnt dann an dieser Position statt vorne.
Der match_parameter steuert die Art des Vergleichs und akzeptiert c, i, n, m und x. Ohne diesen Parameter wird groß- und kleinschreibungsempfindlich gesucht. Stehen sowohl ein c als auch ein i darin, gilt der letzte der beiden; das galt bisher nicht und funktioniert jetzt für alle fünf Funktionen gleich.
Das Muster folgt den Regeln für reguläre Ausdrücke von Invantive UniversalSQL, die bei den einzelnen Funktionen unter Siehe auch beschrieben sind.
Beispiel: Codes filtern und zählen
Das folgende Beispiel ist direkt ausführbar und verwendet beide Funktionen gleichzeitig: regexp_like wählt die Artikelcodes aus, die aus zwei Großbuchstaben, einem Bindestrich und vier Ziffern bestehen, und regexp_count zählt die Ziffern dieser Codes.
create or replace table artikelcodes@InMemoryStorage
as
select 'NL-1234' code
union all
select 'BE-5678' code
union all
select 'losse tekst' code
;
select ace.code
, regexp_count(ace.code, '[0-9]') ziffern
from artikelcodes@InMemoryStorage ace
where regexp_like(ace.code, '^[A-Z]{2}-[0-9]{4}$')
order
by ace.code
Die Ausgabe lautet:
CODE ZIFFERN
----------- -------
BE-5678 4
NL-1234 4
Die Zeile losse tekst entspricht nicht dem Muster und fällt weg.
Beispiel: Großbuchstaben ignorieren
Das folgende Beispiel zeigt den Unterschied, den der match_parameter macht:
select regexp_like('INVANTIVE', 'van') großbuchstabensensitiv
, regexp_like('INVANTIVE', 'van', 1, 'i') großbuchstabenunsensitiv
Die Ausgabe lautet:
GROSSBUCHSTABENSENSITIV GROSSBUCHSTABENUNSENSITIV
----------------------- --------------------------
False True
Siehe auch
Verfügbarkeit
Die neue Funktionalität ist ab der Version 27.0 verfügbar.