In SQL Server können Sie T-SQL PATINDEX()
verwenden Funktion, um ein Muster innerhalb einer Zeichenfolge zu finden. Insbesondere gibt die Funktion nur das erste zurück Vorkommen des Musters innerhalb der Zeichenkette.
Die Funktion akzeptiert zwei Argumente; das Muster und die Schnur.
Innerhalb des Musters können Sie Platzhalterzeichen verwenden.
Syntax
Die Syntax lautet wie folgt:
PATINDEX ( '%pattern%' , expression )
Wobei Muster ist ein Zeichenausdruck, der die zu suchende Folge enthält, und Ausdruck ist der zu suchende Ausdruck.
Beispiel 1 – Grundlegende Verwendung
Hier ist ein Beispiel dafür, 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 einfügen:
SELECT PATINDEX('eer', 'Bob likes beer.') AS Result;
Ergebnis:
+----------+ | Result | |----------| | 0 | +----------+
Wenn jedoch die vollständige Zeichenfolge 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önnten Sie einen einzelnen Platzhalter verwenden:
SELECT PATINDEX('Bob%', 'Bob likes beer.') AS Result;
Ergebnis:
+----------+ | 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 der Anfang und das Ende der Zeichenfolge mit dem Anfang und dem Ende des Musters übereinstimmten. Natürlich stimmte die Mitte des Strings auch mit der Mitte des Musters überein, denn alle anderen Zeichen werden durch das Prozentzeichen überdeckt.
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 (_
), das ein Platzhalter für ein beliebiges einzelnes Zeichen ist. Daher wird es nur übereinstimmen, wenn genau ein Zeichen an dieser Position vorhanden ist.
Natürlich könnte das obige Muster mit vielen verschiedenen Zeichenfolgen übereinstimmen. Zum 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 des _
und %
Platzhalter
Dieses Beispiel zeigt den Unterschied zwischen _
und %
Platzhalterzeichen.
SELECT PATINDEX('B%r', 'Beer') AS '%', PATINDEX('B_r', 'Beer') AS '_', PATINDEX('B__r', 'Beer') AS '__';
Ergebnis:
+-----+-----+------+ | % | _ | __ | |-----+-----+------| | 1 | 0 | 1 | +-----+-----+------+
Der Unterstrich passt nur, wenn an dieser Position genau ein Zeichen steht. 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 zu sehen:
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 Albums WHERE 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 das WHERE
-Klausel, um nur die Alben zurückzugeben, die tatsächlich übereinstimmen, zusammen mit ihrem PATINDEX()
Ergebnis. Wenn ich das WHERE
fallen gelassen habe Klausel wären alle Alben zurückgegeben worden, unabhängig davon, ob sie übereinstimmten oder nicht.
Für diejenigen, die nicht übereinstimmen, der PATINDEX()
Ergebnis wäre 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 zurück Vorkommen des Musters innerhalb der Zeichenkette.
SELECT PATINDEX('%and%', 'Bob and beer and popcorn.') AS Result;
Ergebnis:
+----------+ | Result | |----------| | 5 | +----------+
Der CHARINDEX()
Funktion
Der T-SQL CHARINDEX()
Funktion ist ähnlich wie PATINDEX()
. Es gibt jedoch einige Unterschiede zwischen den beiden. Insbesondere der PATINDEX()
akzeptiert Platzhalterzeichen, aber keine Startposition. CHARINDEX()
akzeptiert dagegen eine Startposition, aber keine Platzhalterzeichen.