Фильтровать строки на основе «Имя» + «Фамилия» в SQL - PullRequest
3 голосов
/ 16 июня 2010

У меня есть пользовательская таблица в моей базе данных, которая содержит два столбца FirstName и LastName. Теперь в моем интерфейсе есть текстовое поле для фильтрации пользователей из этой таблицы. Давайте предположим, что я принимаю этот ввод из внешнего интерфейса в виде входного параметра "@SEARCHKEYWORD" Я создал образец ниже:


DECLARE @Test TABLE
([ID] INT IDENTITY,
[FNAME] NVARCHAR(100),
[LNAME] NVARCHAR(100)
)
INSERT INTO @Test( FNAME, LNAME )
SELECT 'John','Resig' UNION ALL
SELECT 'Dave','Ward' UNION ALL
SELECT 'Peter','Smith' UNION ALL
SELECT 'Dave','Smith' UNION ALL
SELECT 'Girija','Acharya'  UNION ALL
SELECT  'Devendra', 'Gujel' UNION ALL
SELECT 'Arjit', 'Gupta'

DECLARE @SEARCHKEYWORD NVARCHAR(100)

SELECT * FROM @Test WHERE FNAME +' '+ LNAME LIKE @SEARCHKEYWORD

т.е. до сих пор я думал об этом запросе, чтобы отфильтровать строки, но он не дает желаемых результатов: <pre> SELECT * FROM @Test WHERE FNAME +' '+ LNAME LIKE @SEARCHKEYWORD

Вот желаемые выходы, которые мне нужны для входов, упомянутых ниже: </p> <p>--WHEN @SEARCHKEYWORD='John Resig' --Desired OUTPUT: the row which contains 'John','Resig' </p> <p>--WHEN @SEARCHKEYWORD='Ac' --Desired OUTPUT: the row which contains 'Girija','Acharya' </p> <p>--WHEN @SEARCHKEYWORD='Smith' --Desired OUTPUT: the row which contains 'Peter','Smith' and 'Dave','Smith'</p> <p>--WHEN @SEARCHKEYWORD='g' --Desired OUTPUT: the row which contains 'Devendra', 'Gujel' and 'Arjit', 'Gupta' </p> <p>--WHEN @SEARCHKEYWORD='Smith' --Desired OUTPUT: the row which contains 'Peter','Smith' and 'Dave','Smith'</p> <p>

Ответы [ 6 ]

5 голосов
/ 16 июня 2010

Соедините их все вместе

SELECT * FROM @Test WHERE (FName like '%' + @SEARCHKEYWORD + '%') OR (LName like '%' + @SEARCHKEYWORD + '%') OR (FName + ' ' + LName like '%' + @SEARCHKEYWORD + '%')
2 голосов
/ 16 июня 2010

Хорошо, этот запрос пропускает все, кроме одного из желаемых вами результатов:

SELECT * FROM @Test WHERE FNAME +' '+ LNAME LIKE '%' + @SEARCHKEYWORD  + '%' 
OR FNAME LIKE '%' + @SEARCHKEYWORD  + '%' OR LNAME LIKE '%' + @SEARCHKEYWORD  + '%'

Один из сценариев, который терпит неудачу:

--WHEN @SEARCHKEYWORD='g' --Desired OUTPUT: the row which contains 'Devendra', 'Gujel' and 'Arjit', 'Gupta'

Вы также получаете ДжонаРеси г и Г Ирия Ачарья по удивительной причине.Мое предложение состоит в том, чтобы позволить пользователю выбирать свои символы подстановки как часть поиска.Следовательно, позволяя им ограничить «g в начале имени», используя что-то вроде «g *» в качестве поискового запроса.

1 голос
/ 16 июня 2010

Почему бы просто не использовать полнотекстовый поиск

http://msdn.microsoft.com/en-us/library/ms142571.aspx

0 голосов
/ 16 июня 2010

Существует несколько способов снятия шкуры с кошки, но это один из них.

Идея такова:

  • Создать другую переменную @LIKE_SEARCHKEYWORD содержит массируемую строку ввода.В этом примере пробелы удаляются из @SEARCHKEYWORD.
  • Создайте внутреннее объединение, извлекая все возможные комбинации имени-фамилии.
  • Пусть оператор LIKE беспокоится только о результатахкомбинации.

С точки зрения производительности, это может быть не лучшим решением, но оно делает вещи довольно чистыми.Если ваша входная таблица не слишком велика, снижение производительности будет незначительным.

Оператор SQL

DECLARE @LIKE_SEARCHKEYWORD NVARCHAR(100)
SET @LIKE_SEARCHKEYWORD = '%' + REPLACE(@SEARCHKEYWORD, ' ', '') + '%'

SELECT  DISTINCT t.*
FROM    @Test t
        INNER JOIN (
          SELECT ID, Name = FName FROM @Test 
          UNION ALL SELECT ID, LName FROM @Test
          UNION ALL SELECT ID, FName + LName FROM @Test
          UNION ALL SELECT ID, LName + FName FROM @Test
        ) n ON n.ID = t.ID
WHERE   n.Name LIKE @LIKE_SEARCHKEYWORD
0 голосов
/ 16 июня 2010

Используйте вот так,

@SEARCHKEYWORD='%Smith%'

SELECT * FROM @Test WHERE FNAME LIKE @SEARCHKEYWORD OR LNAME LIKE @SEARCHKEYWORD
0 голосов
/ 16 июня 2010

Когда вы используете like, вы должны включить подстановочные знаки, а также поисковый термин:

select * from names where forename like 'John%'

найдет все имена, начинающиеся с "Джон"

select * from names where forename like '%Smith'

будетнайти все имена, оканчивающиеся на «Смит»

select * from names where forename like '%g%'

найдет все имена со строчными буквами «g».

Так что, если вы передаете строку поиска в качестве параметравам нужно будет создать оператор like:

select * from names where forename like @SEARCHKEYWORD + '%' or
                          surname like  @SEARCHKEYWORD + '%'

найдет имена, где имя или фамилия начинаются с поискового ключевого слова

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...