Ü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?

NLV
quelle

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

Damien_The_Unbeliever
quelle
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.)

Daniel Quinlan
quelle
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