Перевірте, чи містить рядок підрядку в 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 / рекурсивний / вкладений / - "рекурсивний" був би, якби 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[., ]%'

(Поставте пробіли у цитуваному рядку, якщо ви шукаєте ціле слово, або залиште їх, якщо МО може бути частиною більшого слова).


3
Якщо ви шукаєте відповідність слів (ваш другий приклад), вам потрібно буде: а) додати пробіл до та після @mainString (щоб ви могли відповідати першому чи останньому слову) та b) видалити розділові знаки
Damien_The_Unbeliever,

2
Для мене це краще, ніж CHARINDEX (), оскільки в моєму конкретному випадку я не можу виконати функцію CHARINDEX () через обмежені дозволи.
Джеймс Т Снелл

1
(Просто не забудьте встановити префікс усіх своїх постійних констант, Nякщо ваш стовпець є nvarchar, інакше ви отримаєте конверсії за рядками)
Річард Шалай
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.