2015-03-30 2 views
0

Использование SQL Server 2008 без использования полнотекстового индексирования или интеграции CLR, есть лучший способ поиска столбец таблицы для произвольного текста, чем следующее:Есть ли лучший способ поиска произвольного текста в SQL Server 2008 без CLR или полного текста?

declare @SubString nvarchar(max) = 'Desired substring may contain any special character such as %^_[]' 

select * from Items where Name like '%' + 

    replace(
    replace(
    replace(
    replace(
    replace(
    replace(
     @SubString 
    ,';',';;') 
    ,'%',';%') 
    ,'[',';[') 
    ,']',';]') 
    ,'^',';^') 
    ,'_',';_') 

    + '%' escape ';' 

Это работает, но это, кажется, излишне варварскими. Есть ли более простой, понятный или более эффективный способ, учитывая указанные ограничения?

Нет ограничений на то, что может содержать столбец Name, а также то, что может содержать подстрока, которую мы ищем.

+0

Ну, вместо использования 'LIKE' вы можете использовать функцию' CHARINDEX'. Но это не какое-то улучшение. – DeadZone

ответ

0

Единственное, что я могу придумать, - превратить ваш replace(replace(replace... в пользовательскую функцию. Тогда вы можете оптимизировать ваш запрос:

SELECT * FROM Items WHERE Name LIKE CleanMyString(@Substring) escape ';' 

Это не совсем «просто». Это вряд ли будет более эффективным. Но он очищает синтаксис и делает его более чистым.

0

(Вы можете использовать CHARINDEX для прямой строки поиска, таких как поиск каждого ПгвЬЫата, который содержит Бен с:

select * for customers where charindex('Ben', firstname) > 0 

или вы можете создать все виды мощного шаблона поиска с помощью PATINDEX:

SELECT PATINDEX ('%[0-9].%[0-9].%[0-9].%','278.2.6.49'); 

который возвращает число перед первой точкой или 0, если в строке нет трех наборов чисел.

Для очень хорошего внедрения шаблонов (i ts не регулярные выражения) в TSQL (откуда был скопирован приведенный выше пример): https://www.simple-talk.com/sql/t-sql-programming/patindex-workbench/

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