Хранимый SQL-запрос для поисковых запросов на основе нескольких параметров - PullRequest
0 голосов
/ 29 января 2012

Хорошо, мне нужна небольшая помощь с сохраненным процессом, это немного по моей голове, и я не уверен, что делать дальше.SP предназначен для функции поиска в проекте, над которым я работаю.Это найти свободные места на основе выбора от конечного пользователя.Пользователь должен иметь возможность выполнять поиск по следующим параметрам:

Аэропорт вылета (или «ЛЮБОЙ»)

Аэропорт прибытия (или «ЛЮБОЙ»)

Самое раннее время вылета

Время последнего вылета

Доступно минимальное количество мест

Максимальное количество возвращаемых рейсов

Сначала я думал, что отдельные операторы SELECT помогут, но, как вы, наверное, знаетеоператоры SELECT обрабатывались как отдельные запросы, и в результате было получено 6 различных результатов.Итак, я попытался включить их в один SELECT, но моя логика должна быть ошибочной, потому что возврат ошибочен.Если кто-нибудь может указать мне правильное направление, это будет очень цениться.Код следует:

ALTER PROCEDURE [dbo].[usp_FindSeats]
(
@DepartureAirport           char(3),
@ArrivalAirport             char(3),
@EarliestDepTime            datetime,
@LatestDepTime              datetime,
@minSeatsAvailable          int,
@maxFlightsRequested        int

 )

AS
BEGIN

SELECT * FROM Flight
WHERE
(@DepartureAirport = UPPER('ANY') OR DepartAirport = @DepartureAirport)
AND
(@ArrivalAirport = UPPER('ANY') OR ArriveAirport = @ArrivalAirport) 
AND
(DepartTime >= @EarliestDepTime) 
AND
(DepartTime <= @LatestDepTime) 
AND
(FlightSeatsAvailiable >= @minSeatsAvailable) 
AND
((SELECT COUNT(FlightID) FROM Flight) <= @maxFlightsRequested)


--IF (@DepartureAirport = UPPER('ANY')) 
--BEGIN
--(SELECT * FROM Flight WHERE DepartAirport != '')
--END
--ELSE
--SELECT * FROM Flight WHERE DepartAirport = @DepartureAirport


--IF (@ArrivalAirport = UPPER('ANY'))
--Begin
--(SELECT * FROM Flight WHERE ArriveAirport != '')
--END
--ELSE
--SELECT * FROM Flight WHERE ArriveAirport = @ArrivalAirport


--SELECT * FROM Flight WHERE DepartTime >= @EarliestDepTime

--SELECT * FROM Flight WHERE DepartTime <= @LatestDepTime

--SELECT * FROM Flight WHERE FlightSeatsAvailiable >= @minSeatsAvailable

--SELECT * FROM Flight WHERE (SELECT COUNT(FlightID) FROM Flight) <= @maxFlightsRequested

Ответы [ 2 ]

0 голосов
/ 29 января 2012

Попробуйте это:

ALTER PROCEDURE [dbo].[usp_FindSeats]
(
    @DepartureAirport           char(3),
    @ArrivalAirport             char(3),
    @EarliestDepTime            datetime,
    @LatestDepTime              datetime,
    @minSeatsAvailable          int,
    @maxFlightsRequested        int    
 )    
AS

SELECT  TOP(@maxFlightsRequested) * 
FROM    Flight
WHERE   (@DepartureAirport = 'any' OR DepartAirport = @DepartureAirport)
        AND (@ArrivalAirport = 'any' OR ArriveAirport = @ArrivalAirport) 
        AND DepartTime >= @EarliestDepTime
        AND DepartTime <= @LatestDepTime
        AND FlightSeatsAvailiable >= @minSeatsAvailable

Обратите внимание, что если вы ограничите количество возвращаемых строк, возможно, будет хорошей идеей каким-либо образом отсортировать результат (ORDER BY).

0 голосов
/ 29 января 2012

Самый простой подход был бы, если бы я правильно понял ваши потребности:

ВЫБРАТЬ * ИЗ ПОЛЕТА ГДЕ (@DepartureAirport = UPPER ('ЛЮБОЙ') ИЛИ DepartAirport = @DepartureAirport) СОЕДИНЕНИЕ ВЫБРАТЬ * ОТ ПОЛЕТА ГДЕ (@ArrivalAirport = UPPER ('ANY') ИЛИ ArriveAirport = @ArrivalAirport) AUNION SELECT * ИЗ ПОЛЕТА WHERE (DepartTime> = @EarliestDepTime) UNION SELECT * ИЗ ПОЛЕТА WHERE (DepartTime <= @LatestDepTime) СОЮЗ ВЫБРАТЬ * ОТ Flight Flight WHEVE@minSeatsAvailable) UNION SELECT * FROM Flight WHERE ((SELECT COUNT (FlightID) FROM Flight) <= @maxFlightsRequested) </p>

это объединит все результаты в зависимости от ввода пользователя.

...