2012-03-01 4 views
2

Я создаю окно поиска для поиска имени пользователя в моей базе данных. База данных имеет имя и фамилию. Я хочу найти эти поля, чтобы найти пользователей, которые соответствуют запросу. Поэтому я придумал следующее:Использование LIKE в SQL-запросе

SELECT * 
FROM user 
WHERE (firstname + ' ' + lastname) LIKE ('%' + @query + '%') 

Это работает, но я не уверен, что это лучший способ сделать это. Тем более, что база данных становится больше. Есть ли лучшее решение или это будет достаточно?

+0

Вы уверены, что вам нужно 'LIKE'? Кажется, что это будет делать то, что вам нужно ... 'SELECT * FROM user WHERE (firstname + '' + lastname) = @ query' ... Я полагаю, это зависит от того, будет ли ваш @query скорее всего точным – neokio

+0

Возможно, нормально с 'LIKE'] (http://sqlserverperformance.idera.com/tsql-optimization/replace-poorly-performing-substring-function-sql-server-statement/), но если вы беспокоитесь, вы можете использовать SQL Management Studio и проверьте план выполнения для подтверждения производительности. –

+0

Возможно, вам понадобится 'where firstname like '%' + @query + '%' или lastname, например '%' + @query + '%''. Таким образом, совпадение на части либо первого, либо последнего имени будет включено в результирующий набор. – HABO

ответ

4

Посмотрите на полные возможности Text Indexing SQL сервера: http://msdn.microsoft.com/en-us/library/ms142571.aspx

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

Если вы перерастаете это, вы всегда можете рассмотреть что-то вроде Lucene.Net. Он имеет гораздо большую гибкость в отношении операторов запросов. Это полностью отдельный механизм индексирования и запросов, поэтому он, вероятно, займет довольно много рефакторинга. Просто подумать.

+0

Полностью текстовый поиск выглядит потрясающе, дадут ему идти. –

0

Чтобы получить все возможные поисковые запросы, лучший способ - сравнить его индивидуально для получения пользователем вставленного текста поиска, но поскольку он не будет включать полное имя в поиск. Поэтому, чтобы включить полное имя, мы также рассматриваем полное имя, занимая промежуток между ними.

(First_Name LIKE '%' + @SearchText + '%') OR (Last_Name LIKE '%' + @SearchText + '%') OR (First_Name + ' ' + Last_Name LIKE '%' + @SearchText + '%') 
+0

Но не будет ли это просто снижать производительность, давая тот же результат? –

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