2013-04-09 1 views
0

Если у меня есть запись в базе данных «Футболка с мужским белым экипажем», какой SQL-запрос мне нужно запустить, чтобы вернуть запись, если пользователь выполняет поиск «Мужская футболка» или «Белая футболка»?Поиск отдельных слов в предложении в SQL-запросе?

Я использую Microsoft SQL Server 9:

При использовании:

WHERE "Mens T-Shirt" like '%' + @SearchTerm + '%' 

не вернуть "Mens White Crew T-Shirt"?

Спасибо всем!

+1

Что вы пытались? – Don

+3

Какой db вы используете? –

+2

Если ваша СУБД поддерживает массивы и регулярные выражения, вы можете разделить каждый заголовок и поисковый запрос на все слова, а затем сопоставить массивы. Но полный текстовый поиск - лучший способ. Реляционные СУБД не предназначены для такого рода запросов. –

ответ

3

Если у меня есть запись в базе данных о «Mens White Crew T-Shirt», то, что SQL-запрос сделать мне нужно бежать, чтобы вернуть запись, если пользователь ищет «Mens T-Shirt» или «White T-Shirt «?

select * 
from Products 
where Description like '%' + replace(@SearchTerm, ' ', '%') + '%' 
-- where 'Mens White Crew T-Shirt' like '%Mens%T-Shirt%' -- Returns true 
-- where 'Mens White Crew T-Shirt' like '%White%T-Shirt%' -- Returns true 

Вы можете получить как творческие, как вы хотите с заменами (другие символы, такие как дефис, что, к примеру), но это несколько рубить. Это точно не работает для «Men's» или «Shirt White»

Действительно, этот тип запроса - это то, что Full-Text Search - вот и все, а вторая рекомендация a_horse_with_no_name.

Если это невозможно, вам, вероятно, придется идти по пути дезинфекции и разбиения поискового запроса и найденных столбцов и динамического создания запроса. Вы могли бы в конечном итоге с чем-то, что в конечном итоге выглядит следующим образом (с использованием параметров, надеюсь) приходит из вашего приложения:

exec sp_executesql N' 
     select * 
     from Products 
     where Description like ''%'' + @SearchTerm1 + ''%'' 
      and Description like ''%'' + @SearchTerm2 + ''%'' 
      and Description like ''%'' + @SearchTerm3 + ''%'' 
      -- etc.', 
    N'@SearchTerm1 varchar(100), @SearchTerm2 varchar(100), @SearchTerm3 varchar(100)', 
    'Mens', -- What about "men" or "man", and this would still get "womens" 
    'T', -- Any "T", yikes...possibly have to sanitize the column and search term to "tshirt" 
    'Shirt' 

Но это еще не будет охватывать все, что FTS может, и, возможно, не так быстро.

+0

Я просто потратил 5 минут между вашим оригиналом и вашим редактированием. Думаю, моя ссылка на функцию split все еще немного полезна. хе-хе. – TTT

+0

Ха, хорошо. Я просто хотел привести более конкретный пример динамической версии, но FTS - это, вероятно, путь. –

1

Вы можете предоставить пользователю возможность, когда они выполняют поиск, для «Содержит точную фразу» или «Содержит все слова». Точная фраза - это то, что вы делаете сейчас. Для соответствия для всех слов, вам нужно сначала разбить слово для поиска в слова, как это:

T-SQL Split String

Просто убедитесь, что вы измените запятую в пространство, когда вы используете функцию. Затем вы можете добавить ИНЕКЕ к категории для каждого термина, который возвращается из разделенной функции:

WHERE Item LIKE '%Mens%' 
AND Item LIKE '%T-Shirt%' 

Заметим, что это похоже на ответ Тима, за исключением того, что в его примере слова должны были быть в правильном а здесь нет. (На самом деле - у его редактирования тоже есть эта идея.)

Но, чтобы повторить, просмотрите полнотекстовый поиск, так как если вы можете реализовать это, вы, вероятно, будете более счастливы, чем то, что вы можете сделать таким образом.

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