2016-09-21 2 views
1

Я пытаюсь создать бизнес-каталог, в котором я использую следующий запрос, чтобы извлекать данные из двух таблиц, содержащих информацию о бизнесе.TSQL-запрос для фильтрации каталога

select * 
from BND_Listing 
left join BND_ListingCategories on BND_Listing.CatID = BND_ListingCategories.CatID 
order by Company asc 

У меня есть форма, которая имеет 3 выпадающие Я использую для фильтрации выше запрос с помощью «фильтров», которые на самом деле являются только компоненты, которые мне нужно добавить в мой запрос выше, который будет слушать строки запроса значения, передаваемые в по форме.

При отправке моей формы я перенаправляю обратно на тот же URL-адрес, но добавляю следующее в своем URL-адресе на основе значений, выбранных из 3 раскрывающихся полей.

filter-Category=[Category]&filter-City=[City]&filter-State=[State] 

У меня это работает правильно, но у меня возникают трудности, когда значение не передается в мой URL. Это происходит, когда пользователь фильтрует только один из трех возможных полей. Чтобы исправить это, я думаю, что могу создать значение «Все», которое будет похоже на filter-State = ALL

Как я могу обновить свой запрос, чтобы извлекать данные для прослушивания этих фильтров в строке запроса?

Любое понимание, примеры действительно оценены.

Надеюсь, что у меня есть смысл. Я все еще новичок в программировании.

Следующий запрос возвращает 0 результатов, пока не будут установлены все фильтры. Если установлен только один фильтр, он разбил мое приложение.

select * 
from BND_Listing 
where 
    (Category = '[querystring:filter-Category]' 
    or '[querystring:filter-Category]'='All') 
    and 
    (City = '[querystring:filter-City]' 
    or '[querystring:filter-City]'='All') 
    and 
    (State = '[querystring:filter-State]' 
    or '[querystring:filter-State]'='All') 

UPDATE:

Спасибо за все входные каждый.

Я пробовал этот упрощенный запрос в SQL Server Management Studio для тестирования.

SELECT * 
FROM BND_listing 
WHERE city = IsNull('Trinity', city) 

Он не возвращает никаких результатов, даже если «Троица», на самом деле город в одном из моих записей в таблице BND_Listing.

Я понимаю, что ВСЕ добавит больше фильтров, но этот базовый запрос все еще не тянет что-нибудь?

UPDATE 2:

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

select * 
from BND_Listing 

Плюс более сложный запрос, используемый для фильтрации результатов? До сих пор все примеры запросов нигде не попадали из моей сетки из-за инструкции WHERE.

ответ

1

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

Другим (менее эффективным) вариантом было бы использовать LIKE вместо = в вашем предикате. Например:

SELECT * 
FROM BND_Listing 
WHERE Category LIKE CASE 
        WHEN [querystring:filter-Category] = 'All' THEN '%' 
        ELSE '[querystring:filter-Category]' 
        END 
AND City LIKE CASE 
        WHEN [querystring:filter-City] = 'All' THEN '%' 
        ELSE '[querystring:filter-City]' 
        END 
AND State LIKE CASE 
        WHEN [querystring:filter-State] = 'All' THEN '%' 
        ELSE '[querystring:filter-State]' 
        END 
1

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

SELECT * 
FROM BND_Listing 
WHERE (Category = '[querystring:filter-Category]' OR 
     '[querystring:filter-Category]' = 'All' OR 
     COALESCE([querystring:filter-Category], '') = '') AND 
     (City = ...) 
... 
+0

Спасибо Тим, я просто прочитал немного о COALESCE, чтобы понять. Итак, в вашем примере (...) я бы просто продолжал работу с COALESCE и включал все фильтры? – UserSN

1

Может быть, вы могли бы попробовать что-то вроде этого.

SELECT * 
    FROM BND_listing 
WHERE category = IsNull('[querystring:filter-Category]', category) 
    AND city = IsNull('[querystring:filter-City]', city) 
    AND state = IsNull('[querystring:filter-State]', state) 

Эта функция проверяет наличие активного фильтра, если таковой имеется, и сравнивает соответствующее поле, чтобы убедиться, что оно соответствует.

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

+0

Просто, чтобы прояснить это, нужно решить проблему без добавления фильтра ALL. если фильтр ALL принят, он не будет работать. если только один из столбцов не является строкой «Все» –

+0

Я установил свою форму так, чтобы, если ни одна категория не выбрана, она автоматически передает строку «Все» – UserSN

1

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

SELECT * 
FROM BND_listing 
WHERE (category = '[querystring:filter-Category]' OR [querystring:filter-Category]' is NULL) 
    AND (city = '[querystring:filter-City]' OR '[querystring:filter-City]' IS NULL) 
    AND (state ='[querystring:filter-State]' OR '[querystring:filter-State]' IS NULL) 

Примечание: Этот метод будет использовать любой INDEX подарок на Category или city или state где, как ISNULL или COALESCE метод будет ограничивать оптимизатор от использования INDEX

+0

Prdp, при использовании этого запроса в моей сетке он не извлекает данные. Даже при передаче значения querysting ALL. Также в pageload нет загружаемого запроса, пока кто-то не нажат на поиск, в котором я хотел бы загрузить все мои записи. – UserSN

+0

Dont pass all pass Null –

+0

Даже при передаче Null моя сетка пуста. Тем не менее, я немного модифицирую запрос, используя левое соединение, чтобы привязать таблицу категорий, которая повлияет на функциональность? – UserSN

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