Überprüfen Sie mithilfe einer gespeicherten Prozedur, ob eine Zeichenfolge eine Teilzeichenfolge in SQL Server 2005 enthält


245

Ich habe eine Schnur @mainString = 'CATCH ME IF YOU CAN'. Ich möchte überprüfen, ob das Wort MEdrin ist @mainString.

Wie überprüfe ich, ob eine Zeichenfolge in SQL eine bestimmte Teilzeichenfolge enthält?

Antworten:


395

CHARINDEX () sucht nach einer Teilzeichenfolge in einer größeren Zeichenfolge und gibt die Position der Übereinstimmung zurück oder 0, wenn keine Übereinstimmung gefunden wird

if CHARINDEX('ME',@mainString) > 0
begin
    --do something
end

Bearbeiten oder von Daniels Antwort: Wenn Sie ein Wort (und keine Unterkomponenten von Wörtern) suchen möchten, sieht Ihr CHARINDEX-Aufruf folgendermaßen aus:

CHARINDEX(' ME ',' ' + REPLACE(REPLACE(@mainString,',',' '),'.',' ') + ' ')

(Fügen Sie rekursivere REPLACE () - Aufrufe für andere möglicherweise auftretende Interpunktionen hinzu


2
Okie ich habe PATINDEX benutzt. Danke dir!
NLV

1
s / rekursiv / verschachtelt / - "rekursiv" wäre, wenn es REPLACEselbst aufgerufen würde ; "verschachtelt" ist, wenn das Ergebnis eines Funktionsaufrufs sofort an eine andere Funktion übergeben wird.
Fund Monica Klage

2
Würde das 'ME' in SQL zwischen Groß- und Kleinschreibung unterscheiden oder müssten Sie auch eine if-Anweisung für 'Me' und 'me' ausführen?
a.powell

5
@ a.powell - hängt von der jeweiligen Kollatierung ab. Sie können es jederzeit innerhalb dieses Tests erzwingen, wenn Sie es auf die eine oder andere Weise benötigen. ZB vergleichen select CHARINDEX('ME' collate Latin1_General_CS_AS,'Home')und select CHARINDEX('ME' collate Latin1_General_CI_AS,'Home'). (In Kollatierungen CSsteht für Groß- und Kleinschreibung und ich bin sicher, dass Sie trainieren können CI).
Damien_The_Unbeliever

2
@VincePanuccio - Die String- Verarbeitung von T-SQL ist notorisch schwach. Die Stärke von SQL liegt in satzbasierten Operationen. In diesem Fall (wenn Sie eine Zeichenfolgenverarbeitung durchführen möchten und ein regulärer Ausdruck eine offensichtliche Lösung wäre) wählen Sie eher das falsche Werkzeug für den Job aus.
Damien_The_Unbeliever

120

Sie können einfach Platzhalter im Prädikat verwenden (nach IF, WHERE oder ON):

@mainstring LIKE '%' + @substring + '%'

oder in diesem speziellen Fall

' ' + @mainstring + ' ' LIKE '% ME[., ]%'

(Setzen Sie die Leerzeichen in die Zeichenfolge in Anführungszeichen, wenn Sie nach dem gesamten Wort suchen, oder lassen Sie sie weg, wenn ME Teil eines größeren Wortes sein kann.)


3
Wenn Sie nach Wortübereinstimmungen suchen (Ihr zweites Beispiel), müssen Sie a) vor und nach @mainString ein Leerzeichen einfügen (damit Sie das erste oder letzte Wort abgleichen können) und b) Interpunktion entfernen
Damien_The_Unbeliever

2
Dies ist für mich besser als CHARINDEX (), da ich in meinem speziellen Fall die Funktion CHARINDEX () aufgrund eingeschränkter Berechtigungen nicht ausführen kann.
James T Snell

1
(Vergessen Sie nur nicht, allen Ihren String-Konstanten ein Präfix voranzustellen, Nwenn Ihre Spalte eine ist nvarchar, sonst erhalten Sie zeilenweise Konvertierungen.)
Richard Szalay
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.