2015-05-13 2 views
0

Упрощенный пример того, что мне нужно:выберите из таблицы, где column = anything

Таблица «Транспорт» имеет 2 столбца; «Автомобиль» и «Цвет». Пользователь может фильтровать записи либо автомобилем, либо цветом, либо обоими.

variable vehicle_choice = user_selected_vehicle (selected from a dropdown for example) 
variable colour_choice = user_selected_colour 

If user_selected_vehicle = nothing selected Then 
    vehicle_choice = * 
End if 

If user_selected_colour = nothing selected Then 
    colour_choice = * 
End if 

Select query = ("Select * From Transport Where Vehicle = vehicle_choice And Colour = colour_choice") 

Таким образом, если пользователь хотел «красный» «автобус» запрос будет выглядеть следующим образом:

("Select * From Transport Where Vehicle = 'bus' And Colour = 'red'") 

Какой бы хорошо и найти запись, если она существует.

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

("Select * From Transport Where Vehicle = * and Colour = 'yellow'") 

Очевидно, что это все в составленной синтаксисе, но это то, что я хочу, это возможно в SQL? (Использование MS SQL Server 2008)

+1

Erland Sommarskog написал довольно приличную статью под названием [Динамические условия поиска в T-SQL] (http://www.sommarskog.se/dyn-search.html), которая охватывает большинство сценариев. –

+0

Кроме того, я бы рекомендовал прочитать [эту статью] (http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/) в блоге «SQL in the Wild». –

+0

Я собираюсь узнать больше и обязательно посмотрю на эти статьи, спасибо. – Ryan

ответ

1

Вот два типичных способа решения этой проблемы. Предположим, что пользовательский ввод в переменных @vehicle и @colour:

where (vehicle = @vehicle or @vehicle is null) and 
     (colour = @colour or @colour is null) 

Проблема с этим подходом является использование индексов. Стратегии индексирования затрудняются с or. Итак, если вы строите запрос динамически, то лучше всего добавить пункты, которые вы хотите:

@where = '1 = 1' + 
     (case when @vehicle is not null then ' and vehicle = @vehicle' else '' end) + 
     (case when @colour is not null then ' and colour = @colour' else '' end); 
+0

А, это имеет смысл. Я попробую сейчас и вернусь. – Ryan

+0

ОК, это прекрасно работает и это то, что мне нужно. Большое спасибо. Примут в ближайшее время. – Ryan

0

Вы можете подготовить 2-й запрос,

("Select * From Transport Where Vehicle = * and Colour = 'yellow'") 

к этому

("Select * From Transport Where Vehicle = Vehicle and Colour = 'yellow'") 

Это только идея, как решить вашу проблему.

+0

Моя проблема в том, что 'column = *' не работает. Мне нужно знать, какой правильный синтаксис для столбца может равняться чему угодно. Будет ли это означать столбец = столбец? – Ryan

+0

@ Ryan Я дал вам решение выше :) – Parado

1

Вы можете попробовать что-то вроде

("Select * From Transport Where Vehicle like '%' and Colour = 'yellow'") 
+0

Это также работает и является простым решением. Мне просто нужно было бы изменить запрос так, чтобы все параметры столбца были 'like' вместо '=' и изменили значение null на '%'. – Ryan

0

Да. это possible.just изменить ваш запрос, как это:

предположим, что ваш параметр раскрывающийся:

ddl1.val -- for transport 
ddl2.val -- for color 

теперь предположим, ваши значения DDL по умолчанию является «0» или что-то для «выбрать все» option.now запроса будет:

Select * From Transport Where (Vehicle = ddl1.val or ddl1.val='0') and 
(Colour = ddl2.val or ddl2.val='0') 

альтернативный способ сделать это:

Select * From Transport Where Vehicle like '%' and Colour = 'color_selected' 

дайте мне знать, если и хотят любой о Эти разъяснения касаются этого.

0
declare @vehicle_choice nvarchar(255) 
declare @colour_choice nvarchar(255) 
set @colour_choice = 'bus' 
set @colour_choice = 'blue' 

Select * From Transport 
    where 1= 1 
    and Vehicle like (case when @vehicle_choice Is null or @vehicle_choice = '' then '%' else @vehicle_choice end) 
    and Colour like (case when @colour_choice Is null or @colour_choice = '' then '%' else @colour_choice end) 
Смежные вопросы