Проверьте, содержит ли строка подстроку в 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.