简体   繁体   English

基于多个参数的SQL存储Proc搜索查询

[英]SQL Stored Proc For Search Query Based on Multiple Parameters

Ok, I need a little help with a stored proc, that is a little bit over my head and I am not sure how to proceed. 好的,我需要一些有关存储过程的帮助,这有点麻烦,而且我不确定该如何进行。 The SP is for a search function in a project I am working on. SP用于我正在研究的项目中的搜索功能。 It is to find available seats based on selections from the end user. 它是根据最终用户的选择来查找可用座位的。 The user should be able to search based on the following: 用户应该能够基于以下内容进行搜索:

Departure airport (or "ANY") 出发机场(或“任何”)

Arrival airport (or "ANY") 到达机场(或“任何”)

Earliest Depart time 最早出发时间

Latest Depart time 最晚出发时间

Min Seats Available 最少座位

Max Flights to be Returned 最多可退回的航班

I initially thought separate SELECT statements would do the trick, but as you probably know, the select statements were treated as separate queries and the return resulted in 6 different returns. 最初,我认为单独的SELECT语句可以解决问题,但是您可能知道,select语句被视为单独的查询,并且返回结果有6种不同的返回值。 So, I attempted to include them in one SELECT, but my logic must be screwy, because the return is faulty. 因此,我试图将它们包含在一个SELECT中,但是我的逻辑必须是错误的,因为返回错误。 If anyone can point me in the right direction it would be very much appreciated. 如果有人能指出我正确的方向,将不胜感激。 Code follows: 代码如下:

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

Simplest approach would be, if i understand your need correctly: 如果我正确理解您的需求,最简单的方法是:

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

this would aggregate all the results depending on user's input. 这将根据用户的输入汇总所有结果。

Try this: 尝试这个:

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

Note that if you limit the number of rows returned, it's probably a good idea to sort the result in some way (ORDER BY). 请注意,如果您限制返回的行数,则最好以某种方式对结果进行排序(ORDER BY)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM