Sprawdź, czy ciąg zawiera podciąg w SQL Server 2005, używając procedury składowanej

Odpowiedzi:

395

CHARINDEX () wyszukuje podciąg w obrębie większego łańcucha i zwraca pozycję dopasowania lub 0, jeśli nie znaleziono dopasowania

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

Edytuj lub z odpowiedzi Danielsa, jeśli chcesz znaleźć słowo (a nie podskładniki słów), twoje wywołanie CHARINDEX wyglądałoby następująco:

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

(Dodaj więcej rekurencyjnych wywołań REPLACE () dla każdej innej interpunkcji, która może wystąpić

Damien_The_Unbeliever
źródło
2
Okie użyłem PATINDEX. Dziękuję Ci!
NLV
1
s / rekursywny / zagnieżdżony / - „rekurencyjny” byłby REPLACEnazwany sam; „zagnieżdżony” ma miejsce, gdy wynik wywołania funkcji jest natychmiast przekazywany do innej funkcji.
Pozew funduszu Moniki
2
Czy w „ME” rozróżniana jest wielkość liter w SQL, czy też musiałbyś również wykonać instrukcję if dla „Me” i „me”?
a.powell
5
@ a.powell - zależy od zaangażowanego sortowania. Zawsze możesz wymusić to w ramach tego testu, jeśli potrzebujesz go w ten czy inny sposób. Np. Porównaj select CHARINDEX('ME' collate Latin1_General_CS_AS,'Home')i select CHARINDEX('ME' collate Latin1_General_CI_AS,'Home'). (W zestawieniach CSoznacza Case Sensitive i jestem pewien, że możesz poćwiczyć CI).
Damien_The_Unbeliever
2
@VincePanuccio - T-SQL w łańcuch przetwarzania jest notorycznie słaby. Siła SQL polega na operacjach opartych na zestawach. W tym przypadku (chcąc wykonać przetwarzanie łańcucha znaków i coś, w którym wyrażenie regularne byłoby oczywistym rozwiązaniem), chodzi raczej o to, że wybierają niewłaściwe narzędzie do zadania.
Damien_The_Unbeliever
120

Możesz po prostu użyć symboli wieloznacznych w predykacie (po JEŻELI, GDZIE lub WŁĄCZONY):

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

lub w tym konkretnym przypadku

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

(Umieść spacje w cytowanym ciągu, jeśli szukasz całego słowa, lub pomiń je, jeśli ME może być częścią większego słowa).

Daniel Quinlan
źródło
3
Jeśli szukasz dopasowań słów (drugi przykład), musisz: a) dodać spację przed i po @mainString (aby dopasować pierwsze lub ostatnie słowo), oraz b) usunąć interpunkcję
Damien_The_Unbeliever
2
Jest to dla mnie lepsze niż CHARINDEX (), ponieważ w moim szczególnym przypadku nie mogę wykonać funkcji CHARINDEX () z powodu ograniczonych uprawnień.
James T Snell
1
(Po prostu nie zapomnij o prefiksie wszystkich stałych ciągu, Njeśli twoja kolumna jest nvarchar, w przeciwnym razie uzyskasz konwersje w wierszu)
Richard Szalay