Проверьте, содержит ли строка подстроку в SQL Server 2005, используя хранимую процедуру

245

У меня есть строка @mainString = 'CATCH ME IF YOU CAN'. Я хочу проверить, есть ли слово MEвнутри @mainString.

Как проверить, имеет ли строка определенную подстроку в SQL?

NLV
источник

Ответы:

395

CHARINDEX () ищет подстроку в большей строке и возвращает позицию совпадения, или 0, если совпадение не найдено

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

Отредактируйте или ответ от daniels, если вы хотите найти слово (а не подкомпоненты слов), ваш вызов CHARINDEX будет выглядеть так:

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

(Добавьте более рекурсивные вызовы REPLACE () для любой другой пунктуации, которая может произойти

Damien_The_Unbeliever
источник
2
Хорошо, я использовал PATINDEX. Спасибо!
NLV
1
s / recursive / nested / - "recursive" будет, если REPLACEвызван сам; «вложенный» - это когда результат вызова функции сразу передается другой функции.
Фонд Моника иск
2
Будет ли 'ME' чувствительным к регистру в SQL, или вам также придется делать оператор if для 'Me' и 'me'?
a.powell
5
@ a.powell - зависит от параметров сортировки. Вы всегда можете форсировать его в этом тесте, если вам это нужно так или иначе. Например, сравнить select CHARINDEX('ME' collate Latin1_General_CS_AS,'Home')и select CHARINDEX('ME' collate Latin1_General_CI_AS,'Home'). (В сопоставлениях CSобозначает Case Sensitive, и я уверен, что вы можете работать CI).
Damien_The_Unbeliever
2
@VincePanuccio - T-SQL в строке обработка , как известно , слабая. Сила SQL в операциях на основе множеств. В этом случае (желая выполнить обработку строк и что-то, где регулярное выражение было бы очевидным решением), это скорее случай, когда они выбирают неправильный инструмент для работы.
Damien_The_Unbeliever
120

Вы можете просто использовать подстановочные знаки в предикате (после IF, WHERE или ON):

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

или в этом конкретном случае

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

(Вставьте пробелы в строке в кавычках, если вы ищете слово целиком, или пропустите их, если ME может быть частью большего слова).

Даниэль Куинлан
источник
3
Если вы ищете совпадения слов (ваш второй пример), вам нужно: а) добавить пробел до и после @mainString (чтобы вы могли сопоставить первое или последнее слово) и б) удалить знаки препинания
Damien_The_Unbeliever
2
Это лучше, чем CHARINDEX () для меня, потому что в моем конкретном случае я не могу выполнить функцию CHARINDEX () из-за ограниченных разрешений.
Джеймс Т Снелл
1
(Только не забудьте поставить перед всеми вашими строковыми константами префикс, Nесли ваш столбец равен nvarchar, иначе вы получите преобразования для каждой строки)
Ричард Сзалай