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

So finden Sie eine Zeichenfolge in einer Zeichenfolge in SQL Server

In SQL Server können Sie T-SQL CHARINDEX() verwenden Funktion oder die PATINDEX() Funktion, um eine Zeichenfolge in einer anderen Zeichenfolge zu finden. Hier ist ein kurzer Überblick über jede Funktion.

Die CHARINDEX()-Funktion

Diese Funktion akzeptiert 3 Argumente; die zu suchende Zeichenkette, die zu suchende Zeichenkette und eine optionale Startposition.

Der CHARINDEX() Syntax sieht so aus:

CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

Wobei expressionToFind ist der Ausdruck, den Sie in der anderen Zeichenfolge finden möchten, und expressionToSearch ist die andere Saite. Der optionale start_location kann verwendet werden, um eine Position innerhalb von expressionToSearch anzugeben zu suchen.

Beachten Sie, dass nur die Position des ersten Vorkommens zurückgegeben wird.

Beispiel

Hier ist ein Beispiel:

SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.');

Ergebnis:

1

In diesem Beispiel ist das erste Argument Bob , was bedeutet, dass wir das zweite Argument nach Bob suchen . Das Ergebnis ist 1, weil das die Position ist, an der Bob steht erscheint zuerst im zweiten Argument.

Vielleicht bemerken Sie auch diesen Bob erscheint tatsächlich zweimal im String, aber es wird nur die Position des ersten Treffers zurückgegeben.

Keine Übereinstimmung

Wenn das zweite Argument Bob nicht enthielt das Ergebnis wäre 0 gewesen .

SELECT CHARINDEX('Kate', 'Bob likes beer. Bob also likes beef.');

Ergebnis:

0

Festlegen einer Startposition

Sie können eine Startposition angeben, an der die Suche beginnen soll. Dies bedeutet, dass SQL Server jedes Vorkommen überspringt, das vor dieser Startposition steht. Die Ergebnisse werden jedoch weiterhin basierend auf ihrer Position innerhalb der Zeichenfolge (nicht von der Startposition) gemeldet.

Wenn dies verwirrend klingt, sollte das folgende Beispiel helfen:

SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);

Ergebnis:

17

In diesem Beispiel beginnen wir also mit der Suche an Position 16 (was zufällig das Leerzeichen vor dem 2. Bob ist ). Das Ergebnis ist das erste Vorkommen von Bob wird übersprungen und die Position des zweiten zurückgegeben. Und wir können sehen, dass seine Position 17 Zeichen vom Anfang der Zeichenfolge entfernt ist (obwohl es nur ein Zeichen von dem ist, wo wir mit der Suche begonnen haben).

Groß-/Kleinschreibung

Sie können explizit eine Suche mit Berücksichtigung der Groß-/Kleinschreibung durchführen, indem Sie die COLLATE-Klausel zu Ihrer SELECT-Anweisung hinzufügen:

Groß-/Kleinschreibung beachten

Hier ist eine Suche, bei der die Groß-/Kleinschreibung beachtet wird:

SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CS_AS);

Ergebnis:

0

Hierbei wird die Groß-/Kleinschreibung beachtet, da _CS steht für Case-Sensitive.

Groß-/Kleinschreibung beachten

Und hier ist eine Suche ohne Berücksichtigung der Groß-/Kleinschreibung:

SELECT CHARINDEX('Beer', 'Bob likes beer.' COLLATE Latin1_General_CI_AS);

Ergebnis:

11

Dabei wird die Groß-/Kleinschreibung nicht beachtet, da _CI steht für Case-Insensitive.

Die PATINDEX()-Funktion

Der PATINDEX() funktioniert ähnlich wie CHARINDEX() . Sie haben grundsätzlich die Wahl, welche Sie verwenden möchten. Der Hauptunterschied liegt in der Syntax.

Der PATINDEX() Die Syntax der Funktion 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 (normalerweise eine Spalte).

Der PATINDEX() akzeptiert Platzhalterzeichen, aber keine Startposition. CHARINDEX() akzeptiert dagegen eine Startposition, aber keine Platzhalterzeichen.

Beispiele

Hier ist ein Beispiel:

SELECT PATINDEX('%eer%', 'Bob likes beer.');

Ergebnis:

12

Folgendes passiert jedoch, wenn wir die Platzhalterzeichen nicht einfügen:

SELECT PATINDEX('eer', 'Bob likes beer.');

Ergebnis:

0

Hier ist ein weiteres Beispiel, in dem wir ein weiteres Platzhalterzeichen einführen:

SELECT PATINDEX('%b_er%', 'Bob likes beer.');

Ergebnis:

11

In diesem Fall ist der Unterstrich (_ ), was ein Platzhalter für ein beliebiges einzelnes Zeichen ist.