Как искать по нескольким критериям из базы данных с SQL?

2

Я программист-новичок. У меня есть страница, как показано ниже. У меня есть база данных автомобилей, и я должен выполнить поиск из базы данных с этой страницы. Существует множество критериев, по которым пользователи могут вводить и выбирать значения. Но пользователю не нужно заполнять или выбирать все критерии. Например, пользователь может искать автомобиль, который зависит только от "Знак" или может выполнять поиск, который зависит от года = "2007". Топливо = "дизель" Gear = "Автоматический"... и т.д. Моя проблема заключается в том, как спроектировать запрос, который может определить, какие элементы управления имеют значение или нет. Я использую С# и MSSQL Server.

alt text http://img8.imageshack.us/img8/5781/searchad.jpg

Теги:
sql-server

6 ответов

2

Вы должны создать свой запрос достаточно гибким (обработка незаполненных параметров) для работы со всеми условиями поиска. Рассмотрим тот же пример. если пользователь вводил только поле метки и оставался пустым

предположим, что у вас есть эти параметры

@mark varchar(20)
@series varchar(20)
@model varchar(20)

select * from tbl 
where (@mark is null or markColumn=@mark) and
(@series is null or series Column=@series ) and
(@model is null or model Column=@model )

Я бы посоветовал вам передать все параметры indivitually в SP. это позволяет избежать динамического построения запроса и избежать инъекций SQL.

1

Как упоминалось ранее, будьте осторожны с SQL-инъекцией.

Я бы избежал sp с несколькими параметрами, так как эти параметры могут быть довольно многочисленными, и sp должен измениться. Кроме того, запрос qill будет очень медленным.

Из того, что я видел, лучше построить запрос в коде с помощью только необходимых ограничителей/фильтров и избежать

@param is null OR filed = @param

1

вот очень подробная статья о том, как обращаться с этой темой:

Динамические условия поиска в T-SQL от Erland Sommarskog

он охватывает все проблемы и методы попыток писать запросы с несколькими необязательными условиями поиска

вот оглавление:

  Introduction
      The Case Study: Searching Orders
      The Northgale Database
   Dynamic SQL
      Introduction
      Using sp_executesql
      Using the CLR
      Using EXEC()
      When Caching Is Not Really What You Want
   Static SQL
      Introduction
      x = @x OR @x IS NULL
      Using IF statements
      Umachandar Bag of Tricks
      Using Temp Tables
      x = @x AND @x IS NOT NULL
      Handling Complex Conditions
   Hybrid Solutions – Using both Static and Dynamic SQL
      Using Views
      Using Inline Table Functions
   Conclusion
   Feedback and Acknowledgements
   Revision History
  • 1
    Статья Эрланда определенно охватывает все аспекты, и лучше прочитать ее, чем пытаться перефразировать ее здесь. :-)
0

у вас может быть что-то в строках

select * from cars where model like case when @model = '' then '%' else '%'+@model+'%' end

и т.д. и т.д. Уродливый, но он должен работать.

вот быстрый запрос, который я выбил в качестве примера

declare @model varchar(20)
set     @model = 't'
select  * 
from    (
            select 'one' as model
            union
            select 'two'
            union
            select 'three' 
        ) as model
where   model like case when @model = '' then '%' else '%'+@model+'%' end

Затем вы добавляете AND-предложения ad infinitum, используя% s, когда пусто и строка поиска, когда требуется.

0

Linq не создает оператор select, пока он фактически не используется. Таким образом, вы можете сделать что-то похожее на следующее:

public IQueryable<object> GetObjects(int a, string b)
{
     var q = from i in items
             where(i=>i.id == a)
             select i;
     if(!string.IsNullOrEmpty(b))
         q = q.where(o=>o.Name == b);
     return q;
}

Это было от манжеты, поэтому я мог бы иметь синтаксис не на 100%, но он должен быть близок.

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

0

Вы можете составить запрос динамически в своем приложении, объединив все поля, у которых есть значения, указанные для них. Например: "... WHERE Model = 'abc' AND Color = 'Blue' AND...". Поля, которые не имеют значений, просто не будут включены в предложение WHERE. Если вы используете этот метод, вы должны быть ОЧЕНЬ осторожны, чтобы проверить свои поля ввода для атак SQL-инъекций.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню