In SQL Server können Sie die Funktion T-SQL PATINDEX()
verwenden, um ein Muster innerhalb einer Zeichenfolge zu finden. Insbesondere gibt die Funktion nur das erste Auftreten des Musters innerhalb der Zeichenfolge zurück.
Die Funktion akzeptiert zwei Argumente: das Muster und den String.
Sie können Platzhalterzeichen innerhalb des Musters verwenden.
Syntax
Die Syntax geht so:
PATINDEX ( '%pattern%' , expression )
Wobei pattern ein Zeichenausdruck ist, der die zu findende Sequenz enthält, und expression der zu durchsuchende Ausdruck ist.
Beispiel 1 – Grundlegende Verwendung
Hier ist ein Beispiel, wie es funktioniert:
SELECT PATINDEX('%eer%', 'Bob likes beer.') AS Result;
Ergebnis:
+----------+| Result ||----------|| 12 |+----------+
Das Prozentzeichen (%
) ist ein Platzhalterzeichen, das eine beliebige Zeichenfolge mit null oder mehr Zeichen darstellt.
Beispiel 2 – Keine Übereinstimmung
Folgendes passiert, wenn wir die Platzhalterzeichen nicht einschließen:
SELECT PATINDEX('eer', 'Bob likes beer.') AS Result;
Ergebnis:
+----------+| Result ||----------|| 0 |+----------+
Wenn die vollständige Zeichenfolge jedoch ohne Platzhalter mit dem Muster übereinstimmt, erhalten Sie eine Übereinstimmung:
SELECT PATINDEX('Bob', 'Bob') AS Result;
Ergebnis:
+----------+| Result ||----------|| 1 |+----------+
Sie erhalten jedoch keine Übereinstimmung, wenn die Zeichenfolge mehr Zeichen enthält:
SELECT PATINDEX('Bob', 'Bob likes beer.') AS Result;
Ergebnis:
+----------+| Result ||----------|| 0 |+----------+
In diesem Fall können Sie einen einzelnen Platzhalter verwenden:
SELECT PATINDEX('Bob%', 'Bob likes beer.') AS Result;
+----------+| Result ||----------|| 1 |+----------+
Sie könnten auch einen einzelnen Platzhalter irgendwo in der Mitte des Musters verwenden:
SELECT PATINDEX('B%r.', 'Bob likes beer.') AS Result;
Ergebnis:
+----------+| Result ||----------|| 1 |+----------+
In diesem Fall haben wir eine Übereinstimmung erhalten, weil Anfang und Ende der Zeichenfolge mit Anfang und Ende des Musters übereinstimmten. Natürlich stimmte die Mitte der Zeichenfolge auch mit der Mitte des Musters überein, da alle anderen Zeichen durch das Prozentzeichen abgedeckt sind.
Beispiel 3 – Der Unterstrich-Platzhalter
Hier ist ein weiteres Beispiel, in dem wir ein weiteres Platzhalterzeichen einführen:
SELECT PATINDEX('B_er', 'Beer') AS Result;
Ergebnis:
+----------+| Result ||----------|| 1 |+----------+
Der Unterstrich (_
), der ein Platzhalter für jedes einzelne Zeichen ist. Daher wird es nur übereinstimmen, wenn sich genau ein Zeichen an dieser Position befindet.
Natürlich könnte das obige Muster mit vielen verschiedenen Zeichenfolgen übereinstimmen. Beispiel:
SELECT PATINDEX('B_er', 'Beer') AS 'Beer', PATINDEX('B_er', 'Bier') AS 'Bier', PATINDEX('B_er', 'Baer') AS 'Baer', PATINDEX('B_er', 'B er') AS 'B er';
Ergebnis:
+--------+--------+--------+--------+| Beer | Bier | Baer | B er ||--------+--------+--------+--------|| 1 | 1 | 1 | 1 |+--------+--------+--------+--------+
Beispiel 4 – Vergleich der Platzhalter _ und %
Dieses Beispiel zeigt den Unterschied zwischen den Platzhalterzeichen _
und %
.
SELECT PATINDEX('B%r', 'Beer') AS '%', PATINDEX('B_r', 'Beer') AS '_', PATINDEX('B__r', 'Beer') AS '__';
Ergebnis:
+-----+-----+------+| % | _ | __ ||-----+-----+------|| 1 | 0 | 1 |+-----+-----+------+
Der Unterstrich stimmt nur überein, wenn sich genau ein Zeichen an dieser Position befindet. Um zwei Zeichen zu finden, müssen wir zwei Unterstriche verwenden.
Das Prozentzeichen hingegen entspricht einer beliebigen Anzahl von Zeichen, einschließlich Null, wie im folgenden Beispiel gezeigt:
SELECT PATINDEX('Bee%r', 'Beer') AS '%', PATINDEX('Bee_r', 'Beer') AS '_', PATINDEX('Bee__r', 'Beer') AS '__';
Ergebnis:
+-----+-----+------+| % | _ | __ ||-----+-----+------|| 1 | 0 | 0 |+-----+-----+------+
Beispiel 5 – Ein Datenbankbeispiel
Hier ist ein Beispiel für die Verwendung dieser Funktion in einer Datenbankabfrage:
USE Music;SELECT AlbumName, PATINDEX('%the%', AlbumName) AS 'Pattern Index'FROM AlbumsWHERE PATINDEX('%the%', AlbumName) > 0;
Ergebnis:
+-------------------------+-----------------+| AlbumName | Pattern Index ||-------------------------+-----------------|| Singing Down the Lane | 14 || Ziltoid the Omniscient | 9 || No Prayer for the Dying | 15 || The Sixteen Men of Tain | 1 |+-------------------------+-----------------+
In diesem Fall verwende ich die WHERE
Klausel, um nur die Alben zurückzugeben, die tatsächlich übereinstimmen, zusammen mit ihrem PATINDEX()
Ergebnis. Wenn ich die WHERE
Klausel gelöscht hätte, wären alle Alben zurückgegeben worden, unabhängig davon, ob sie übereinstimmten oder nicht.
Für diejenigen, die nicht übereinstimmen, wäre das PATINDEX()
Ergebnis Null.
USE Music;SELECT TOP(10) AlbumName, PATINDEX('%the%', AlbumName) AS 'Pattern Index'FROM Albums;
Ergebnis:
+-------------------------+-----------------+| AlbumName | Pattern Index ||-------------------------+-----------------|| Powerslave | 0 || Powerage | 0 || Singing Down the Lane | 14 || Ziltoid the Omniscient | 9 || Casualties of Cool | 0 || Epicloud | 0 || Somewhere in Time | 0 || Piece of Mind | 0 || Killers | 0 || No Prayer for the Dying | 15 |+-------------------------+-----------------+
Beispiel 6 – Nur erstes Vorkommen
Wie bereits erwähnt, PATINDEX()
gibt nur das erste Vorkommen des Musters innerhalb der Zeichenfolge zurück.
SELECT PATINDEX('%and%', 'Bob and beer and popcorn.') AS Result;
Ergebnis:
+----------+| Result ||----------|| 5 |+----------+
Die Funktion CHARINDEX()
Die Funktion T-SQL CHARINDEX()
ähnelt PATINDEX()
. Es gibt jedoch einige Unterschiede zwischen den beiden. Insbesondere akzeptiert PATINDEX()
Platzhalterzeichen, jedoch keine Startposition. CHARINDEX()
akzeptiert andererseits eine Startposition, jedoch keine Platzhalterzeichen.