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


245

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

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

Ответы:


395

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

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

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

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

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


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, иначе вы получите преобразования для каждой строки)
Ричард Сзалай
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.