Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Funktionsweise der PATINDEX()-Funktion in SQL Server (T-SQL)

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.