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

CHARINDEX() vs. PATINDEX() in SQL Server – Was ist der Unterschied?

In SQL Server können Sie entweder CHARINDEX() verwenden Funktion oder die PATINDEX() Funktion, um einen String innerhalb eines Strings zu finden. Dies sind Transact-SQL-Zeichenfolgenfunktionen, die auch in Azure-Datenbanken verfügbar sind.

Oberflächlich betrachtet scheinen diese Funktionen genau dasselbe zu tun, und in vielen Fällen können Sie verwenden, was immer Sie bevorzugen.

Es gibt jedoch einige Unterschiede, die bestimmen können, welche Funktion Sie in bestimmten Szenarien verwenden möchten. Diese können wie folgt zusammengefasst werden:

  • PATINDEX() können Sie Platzhalterzeichen verwenden, um nach Mustern zu suchen. CHARINDEX() nicht.
  • CHARINDEX() akzeptiert ein drittes Argument, mit dem Sie die Startposition der Suche angeben können. PATINDEX() nicht.

Weitere Einzelheiten zu diesen Punkten weiter unten.

Definition

Schauen wir uns zunächst die offizielle Definition jeder Funktion an.

CHARINDEX()
Sucht nach einem Zeichenausdruck innerhalb eines zweiten Zeichenausdrucks und gibt die Startposition des ersten Ausdrucks zurück, falls gefunden.
PATINDEX()
Gibt die Startposition des ersten Vorkommens eines Musters in einem angegebenen Ausdruck oder Nullen zurück, wenn das Muster nicht gefunden wird, bei allen gültigen Text- und Zeichendatentypen.

Syntax

Und hier ist die offizielle Syntax jeder Funktion.

CHARINDEX()

CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

PATINDEX()

PATINDEX ( '%pattern%' , expression )

Beide Funktionen erlauben Ihnen also, nach einem Zeichenausdruck zu suchen, jedoch den PATINDEX() Mit der Funktion können Sie nach einem Muster suchen . Dies ist also eine zusätzliche Funktionalität, die Sie mit CHARINDEX() nicht erhalten Funktion. Mit PATINDEX() Sie können Platzhalterzeichen verwenden, um ein Suchmuster anzugeben, was in manchen Situationen sehr praktisch sein kann.

Allerdings CHARINDEX() akzeptiert drei Argumente, während PATINDEX() akzeptiert nur zwei. Der CHARINDEX() Die Funktion akzeptiert ein optionales drittes Argument, mit dem Sie die Startposition der Suche angeben können. Mit anderen Worten, der CHARINDEX() Mit dieser Funktion können Sie nur die Übereinstimmungen zurückgeben, die nach einem bestimmten Punkt in der Zeichenfolge auftreten.

Beispiele

Hier sind Beispiele, die die zusätzliche Funktionalität der einzelnen Funktionen demonstrieren.

CHARINDEX()

Hier gebe ich ein drittes Argument an, um eine Position anzugeben, an der die Suche beginnen soll. In diesem Fall wird das erste Vorkommen von Bob übersprungen und es wird die Position des zweiten Vorkommens zurückgegeben.

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

Ergebnis:

17

Wie bereits erwähnt, können Sie dies nicht mit PATINDEX() tun weil es diesen dritten Parameter nicht akzeptiert.

PATINDEX()

Hier ist nun ein Beispiel für etwas, das Sie mit PATINDEX() machen können das geht mit CHARINDEX() nicht . In diesem Beispiel verwenden wir Platzhalterzeichen, um nach einem Muster zu suchen:

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

Ergebnis:

11

In diesem Fall verwenden wir die Prozentzeichen (% ), bei denen es sich um Platzhalter handelt, die angeben, dass eine beliebige Anzahl von Zeichen fortfahren und unserer Suchzeichenfolge folgen könnte. Wir verwenden auch den Unterstrich (_ ), was ein Platzhalter für jedes single ist Zeichen.

Schlussfolgerung

Während also beide CHARINDEX() und PATINDEX() bieten ähnliche Funktionen, und in vielen Fällen könnte einer der beiden anstelle des anderen verwendet werden, es gibt Zeiten, in denen Sie einen über dem anderen verwenden müssen.

Insbesondere würden Sie CHARINDEX() verwenden wenn Sie eine Startposition innerhalb der zu durchsuchenden Zeichenfolge angeben möchten. Und Sie würden PATINDEX() verwenden wann immer Sie ein Muster angeben müssen, nach dem gesucht werden soll.