2013-06-07 4 views
2

Я провел несколько часов, исследуя это, и я довольно тупой, вероятно, из-за моего частого использования выражений RegEx.MS-SQL 2008 Всего слов совпадений

Я ищу, чтобы соответствовать все слово в любом столбце типа VARCHAR или TEXT в Microsoft SQL 2008.

У меня есть CLR Ассамблеи RegEx Function installed.

мне нужно, чтобы соответствовать пистолет в этих типовых случаях:

  • пистолет Loaded
  • Loaded Gun
  • My Gun загружается

, а не в эти случаи:

  • Пушка большой
  • У меня есть оружие
  • Моих пушки больших

Я предпочел бы не пойти вниз полнотекстовой поиск маршрута.

Вот некоторые вещи, которые я пробовал, но потерпел неудачу:

WHERE PATINDEX('%[^a-zA-Z_]' + @keyword + '[^a-zA-Z_]%', name) > 0 

... не принимает во внимание слова в начале строки

WHERE name LIKE '%\b' + @keyword + '\b%' 

... ничего не возвращает

WHERE name LIKE '%[^A-Za-z]' + @keyword + '[^A-Za-z]%' 

... не принимает во внимание слово в начале строки

... наряду с некоторыми другими я не спасти

я не могу полагаться на обычных тестеров выражения, такие как http://gskinner.com/RegExr/, чтобы получить меня через это. Любая помощь оценивается.

+1

Вы действительно используете функцию регулярного выражения CLR? примеры, которые у вас есть, не похожи. –

+0

Я хватаю эту вторую руку. Я думал, что существующий код не похож на документы. Я посмотрю, не могу ли я понять эти документы. Благодарю. –

+1

Вы не используете какую-либо функцию CLR ... только собственные функции 'LIKE' и' PatIndex'. – ErikE

ответ

3

Ключом является изменение name, чтобы произвести сравнения. Просто добавьте пробел в начале и конце, а затем вы получите все слова. Например:

WHERE ' '+name+' ' LIKE '%[^A-Za-z]' + @keyword + '[^A-Za-z]%' 

должен проделать очень хорошую работу.

+0

Это похоже на шарм! Благодаря! –

+2

Это вызовет проблемы для строк, которые имеют максимальную длину или максимальную длину минус единица.Если имя VARCHAR (8000) говорит, и LEN (имя) равно 7999, тогда '' '+ name +' ''не будет иметь завершающего пробела, если LEN (name) равно 8000, тогда' '' + name + ''' будет усечь последнего символа вместе с отсутствием конечного пространства. –

+0

@TT. Если это на самом деле проблема, тогда введите 'name' как' varchar (max) '. –

Смежные вопросы