0

[OK]を、私はちょっと私の頭の上にあるストアドプロシージャを少し必要があり、私はどのように進むかわかりません。 SPは私が取り組んでいるプロジェクトの検索機能用です。エンドユーザーからの選択に基づいて利用可能なシートを見つけることです。複数のパラメータに基づく検索クエリのSQLストアドプロシージャ

出発空港(または「ANY」)

到着空港(または「ANY」)

最も早い出発時間

最新出発時間:ユーザーが次の項目に基づいて検索することができるはずです

分の席

012返すことが可能な

最大の航空券

私は当初、別々のSELECTステートメントがトリックを行うと考えましたが、おそらくあなたが知っているように、selectステートメントは別のクエリとして扱われ、6つの異なるリターンが返されました。だから、私は1つの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 
+0

[複数のオプションパラメータのSQL検索クエリ]の重複が可能です。(http://stackoverflow.com/questions/333965/sql-search-query-for-multiple-optional-parameters) – GSerg

答えて

0

最も簡単な方法私が正しくあなたの必要性を理解していれば、次のようになります。

SELECT *をWHERE (@DepartureAirport = UPPER( 'ANY')OR DepartAirport = @DepartureAirport) フライト FROM (DepartTime> = @EarliestDepTime)フライト FROM (@ArrivalAirport = UPPER( 'ANY')OR ArriveAirport = @ArrivalAirport)フライト FROM UNION SELECT * AUNION SELECT * ((SELECT COUNT(フライトIDフライト FROM(FlightSeatsAvailiable> = @minSeatsAvailable) UNION SELECT * FROMフライト (DepartTime < = @LatestDepTime) UNION SELECT * FROMフライト UNION SELECT * )フライトフライト< = @maxFlightsRequested)

これは、ユーザーの入力に応じてすべての結果を集計します。あなたが制限場合は行数が返され、それはいくつかの方法(ORDER BY)で結果をソートするために、おそらく良いアイデアだと

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 

注:

+0

ありがとうございます。 @dillenmeisterへの私のコメントを参照してください。私は本当にあなたの助けに感謝します。 – CalvinBlount

+0

実際にどのパラメータを送信しているかによって、一度に各パラメータをテストしてから別のパラメータを追加してみてください。あなたの元のコードは良かったが、私はあなたのSELECTを台無しにするかもしれない空のパラメータを送信しているようだ。 – Sagi

0

はこれを試してみてください。

+0

ありがとうございます。その面白い私はあなたと@Sagiの両方のソリューションを試しました - @ Sagiさんはパラメータに関係なくすべての飛行機を私に渡しました。どこが間違っていると思いますか? – CalvinBlount

+0

これらのパラメータを試してください(幅の広い検索が必要です)。 @ArevalAirport = 'any'、@ EarliestDepTime = '2000-01-01'、@LatestDepTime = '2020-01-01'、@ minSeatsAvailable = 0、@maxFlightsRequested = 5、[exec [usp_FindSeats] @DepartureAirport = 'any' ' – dillenmeister

関連する問題