Поиск по шаблону SQL Query - PullRequest
6 голосов
/ 13 марта 2011

Я пишу веб-страницу на C #, связанную с просмотром списка.Мой клиент хотел бы иметь возможность набирать что-то или часть чего-то, что будет показывать результаты.Например, ему нужно текстовое поле, в котором он может ввести номер телефона, часть телефонного номера, имя, город или что-то еще, и будет какой-то SP, который найдет, а затем перечислит информацию.Как я могу сделать это в SQL Sp или в VS 2010?

Ответы [ 5 ]

7 голосов
/ 13 марта 2011

SELECT cols FROM tbl WHERE field LIKE '%' + @input + '%'

3 голосов
/ 13 марта 2011

Как предложили несколько других, используйте оператор LIKE.

Однако НЕ просто помещайте данные, введенные пользователем, прямо в предложение LIKE, как предлагали другие. Это приводит к очень простой и очень опасной уязвимости, известной как атака SQL-инъекцией.

Если вы вставляете ввод пользователя непосредственно в

SELECT cols FROM tbl WHERE field LIKE '%' + input + '%'

тогда пользователь может поместить в текстовое поле следующее:

; DROP TABLE tbl; -

(в качестве примера), что делает ваш оператор SQL следующим:

SELECT cols FROM tbl WHERE field LIKE '%';  (the first part of your query)
DROP TABLE tbl;    (the injected sql that you don't want to let people run; drop the database table)
-- '%'   (the rest of your previous query is commented out)

Всегда проверяйте, использовали ли вы параметризованные операторы SQL или как минимум дезинфицировали свои входные данные. Вы действительно не хотите, чтобы люди могли запускать произвольный SQL на вашем сервере баз данных.

У Джеффа Этвуда (такой славы) есть короткая запись на эту тему. И стоит прочитать это тоже :) 1023 *

1 голос
/ 13 марта 2011

Большинство людей уже сталкивались с частью решения - используйте оператор LIKE.

Но я думаю, что другой аспект проблемы может быть решен в SQL.

Создать вычисляемый столбец varchar (MAX). Включите полнотекстовый индекс в этом поле. Тогда все, что вам нужно сделать, это сделать SQL как:

SELECT * from <TABLE_NAME> WHERE Keywords like '%<search term>%'

Таким образом, вам не нужно делать phone like <search> или name like <search> и т. Д.

0 голосов
/ 13 марта 2011

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

Например, вы могли бы написать запрос, который делает это:

  • Сначала найдите в таблице Customer в столбцах FirstName и LastName имя LIKE, указанное в текстовом поле.ВЫБЕРИТЕ CustomerID для всех совпадений.
  • Затем найдите в таблице «Клиент» и в таблице «Поставщик» в столбце «PhoneNumber» номер телефона, аналогичный номеру в текстовом поле.ВЫБЕРИТЕ CustomerID или SupplierID для всех совпадений.Если какие-либо результаты найдены, объедините их с результатами первого запроса.
  • Продолжайте поиск адресов улиц и запрашивайте другие таблицы.
  • По мере продвижения добавляйте новые записи в набор результатов.
  • После того, как вы запросите все таблицы, в которых вы хотите искать, у вас будет набор результатов, содержащий идентификаторы.Вам нужно выполнить еще одну серию SELECT, чтобы получить информацию, которую вы хотите отобразить пользователю.Если вы смешаете клиентов и поставщиков (и сотрудников и т. Д.), Это может стать довольно сложным.

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

0 голосов
/ 13 марта 2011

Используйте оператор LIKE.

SELECT * FROM Table WHERE PhoneNumber LIKE '%value%' OR Name LIKE '%value%' OR 
City LIKE '%value%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...