Вопрос по tsql, sql, query-string – Использование UNION для извлечения данных в сетку

0

У меня есть сетка данных на моем сайте, где я собираю информацию о компании из 2 таблиц.

Я создаю форму для сортировки этих результатов на основе 3 фильтров (Категория, Штат, Город)

Это мой запрос для загрузки данных в сетку изначально. Я хочу, чтобы он заполнялся ВСЕМИ данными таблицы, пока пользователь не решит их отфильтровать, поэтому я использую UNION, так как без него мой запрос ждет, когда я передам значение строки запроса, чтобы завершить оператор WHERE.

SELECT * FROM BND_listing left join BND_ListingCategories
on BND_Listing.CatID=BND_ListingCategories.CatID

UNION

SELECT * FROM BND_listing left join BND_ListingCategories
on BND_Listing.CatID=BND_ListingCategories.CatID
WHERE (CategoryName = '[querystring:filter-Category]' OR     '[querystring:filter-Category]' is NULL)

Я не уверен, что это правильная процедура для этого.

У меня проблемы с пониманием параметра NULL в этом запросе. При загрузке страницы нет строки запроса.

Только когда пользователь нажимает кнопку «SORT», строка запроса добавляется в URL. Пользователь может выбрать сортировку по 1 или всем 3 фильтрам, но в случае, если они сортируют только по 1 из опций. Строка запроса передаст ALL для двух других, которые остались одни.

IE: filter-Category / Barber% 20Shop / filter-City / All / filter-State / All Здесь пользователь выбирает только «Парикмахерская» из 1 раскрывающегося списка и оставляет выпадающие списки City & State в качестве значений по умолчанию.

Мой запрос, «прослушивающий» параметры строки запроса, работает неправильно в моем приложении. Тем не менее, при использовании следующего в SQL Management Studio он действительно вытягивает мои записи правильно.

SELECT * FROM BND_listing left join BND_ListingCategories
on BND_Listing.CatID=BND_ListingCategories.CatID
WHERE (CategoryName = 'Barber Shop' OR '[querystring:filter-Category]' is      NULL)

Это был бы мой запрос к сетке данных со всеми 3 операторами "Listening" WHERE.

SELECT * FROM BND_listing left join BND_ListingCategories
on BND_Listing.CatID=BND_ListingCategories.CatID

UNION

SELECT * FROM BND_listing left join BND_ListingCategories
on BND_Listing.CatID=BND_ListingCategories.CatID
WHERE (CategoryName = '[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)

Любая помощь, вклад, примеры, понимание высоко ценится!

Примеры онлайн и SQL Studio

показать свой результат с первого выбора и второго выбора. Denny Sutedja
Привет Денни, я добавил фотографии. UserSN
что такое [querystring: фильтр-Категория], Sry IDK, что. это значение ввода из HTML ?? Denny Sutedja
попробуйте изменить ИЛИ '[querystring: filter-City]' имеет значение null на ИЛИ '' '' = '[querystring: filter-City]' Denny Sutedja
Да, это просто токен, чтобы прочитать мою строку запроса для filter-Category = Barber Shop. В чем я не уверен, так это в том, стоит ли мне использовать UNION и добавить базовый оператор выбора, который извлекает ВСЕ данные из моей таблицы? Моя проблема возникает, когда я ухожу только во втором операторе выбора, если я настраиваю его таким образом, когда кто-то заходит на мою страницу, ничего не загружается изначально. UserSN

Ваш Ответ

2   ответа
1

Союз не собирается получить то, что вы хотите. Его цель - объединить результаты двух или более запросов, сохраняя разные значения. В вашем случае первая половина объединения захватывает все данные, а вторая половина - отфильтрованные данные. Поскольку первая половина захватывает все, все возвращается.

Вы, кажется, делаете это, потому что у вас нет фильтров для первого запуска, но вы хотите фильтры во втором запуске.

Не добавляйте предложение where, если строки запроса отсутствуют. Если они присутствуют, добавьте, где и соответствующие пункты.

Вы упоминаете сортировку, но в вашем запросе отсутствует заказ по пунктам. Вы хотите добавить один, если вы хотите, чтобы данные были отсортированы.

1-я загрузка, не где предложение или все фильтры установлены на «ВСЕ»

SELECT * FROM BND_listing left join BND_ListingCategories
on BND_Listing.CatID=BND_ListingCategories.CatID
order by CategoryName, state, city

Последующие загрузки с пунктами where.

SELECT * FROM BND_listing left join BND_ListingCategories
on BND_Listing.CatID=BND_ListingCategories.CatID
WHERE (CategoryName = '[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)
order by CategoryName, state, city

Изменить: Вы не можете иметь 2 запроса, потому что плагин позволяет только 1.

Я предполагаю, что под «прослушиванием» вы подразумеваете строку запроса: фильтр-категория будет заменена тем, что находится в строке запроса категории. Поскольку он заменен в вашем запросе, вы не можете сравнить с нулем. поскольку ни один из фильтров не является «ВСЕМ», вам необходимо принять это во внимание. Попробуй это:

SELECT * 
FROM BND_listing 
left join BND_ListingCategories
    on BND_Listing.CatID=BND_ListingCategories.CatID
WHERE   
    (
        '[querystring:filter-Category]' = 'ALL' -- for when the queryString is set to ALL
        or '[querystring:filter-Category]' = '' -- for when the queryString isn't available like first load. this replaces the is null comparison. you can't compare a string literal to null as they are wrapped in quotes
        or CategoryName = '[querystring:filter-Category]' -- this is the comparison to your column
    )
    AND (
         '[querystring:filter-City]' = 'ALL'
        or '[querystring:filter-City]' = ''
        or city = '[querystring:filter-City]' 
    )
    AND (
        '[querystring:filter-State]'  = 'ALL'
        or '[querystring:filter-State]' = ''
        or state = '[querystring:filter-State]' 
    )
order by CategoryName, state, city
Я постараюсь вставить это в @serverSentinel, пока я только что добавил еще одну страницу перед этой, которая перенаправляет всегда добавляя по крайней мере ВСЕ в мои строки запроса. UserSN
Я отредактировал ответ. Вы не можете сравнивать со значением null in в этом случае, потому что, когда ваш плагин сетки выполняет поиск и замену в запросе, он заменит часть внутри кавычек, оставляя (... или '' is null), что никогда не соответствует действительности. (... или '' = '') будет верным. serverSentinel
Спасибо за ответ @serverSentinel, у меня нет возможности сделать 2 отдельных запроса с моим плагином grid. Нет ли способа объединить оба запроса так, чтобы он выполнял 1-ю загрузку с 1-м запросом и со 2-й загрузкой в ​​фоновом режиме в ожидании строки запроса? Для сортировки я имел в виду только действие пользователя, выбирающего поле из моего раскрывающегося списка, которое вводит строку запроса, вытягивая только совпадающие поля. Не фактическая сортировка в SQL. UserSN
0

Спасибо за всю помощь и примеры. Я смог отсортировать свои запросы на самом деле, у меня была проблема с сеткой, которую нужно было решить 1-й.

select * FROM BND_listing right join BND_ListingCategories
on BND_Listing.CatID=BND_ListingCategories.CatID
where 
(CategoryName = '[querystring:filter-Category]' or '[querystring:filter-    Category]'='All')
and
(City = '[querystring:filter-City]' or '[querystring:filter-City]'='All')
and
(Region= '[querystring:filter-State]' or '[querystring:filter-State]'='All')
and
(Country= '[querystring:filter-Country]' or '[querystring:filter-    Country]'='All')

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

Похожие вопросы