Neue SQL-Funktionen regexp_like und regexp_count

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.