2017-07-05 11 views
0

私はストアドプロシージャを持っています。そこでは、条件がある場合はnull以外の値を選択し、それ以外の場合はテーブルからnull値を選択します。誰もが親切に私を助けて。これでsqlのWhere句内の条件

ALTER PROCEDURE SearchPromotionBYPromotionANDVehicleID 

@PromotionCode VARCHAR(100) 
,@TypeId INT 
,@LocationId INT 
,@ClientId INT 
AS 
BEGIN 

SET NOCOUNT ON; 


SELECT top 1 tp.PromotionID 
    ,tp.PromotionCode 
    ,tp.ClientID 
    ,tp.StartDate 
    ,tp.EndDate 
    ,tp.VehicleTypeId 
    ,tv.VehicleType 
    ,tp.LocationId 

FROM tblstudent tp 
LEFT OUTER JOIN tblType tv ON tp.TypeId = tv.TypeId 
WHERE tp.PromotionCode = @PromotionCode 

    AND 
    ((@LocationId IS NOT NULL AND tp.LocationId = @LocationId) OR (tp.LocationId IS NULL) OR (@LocationId IS NULL) or (tp.LocationId = 0)) 

をロケーションIDと同じプロモーションコードとすべての場所での1(つまり、ロケーションIDが0である)と、互いの2つのレコード(R1とR2)を検討してください。パラメータ@locationIdが値を持つ場合(レコードr2の値と等しい値を考慮する)、レコード2を返す必要があります。それ以外の場合は、r1を返す必要があります。

+0

問題は、locationID1でレコードを追加し、次に0のlocationID2で別のロケーションIDでレコードを追加するときです。locationID2を選択すると、locationId 0のレコードが返されます –

+0

サンプルデータを単語で記述するのではなく、DDL + DMLを使用してください。こうすることで、テスト環境にコピーして正確な回答を得ることができます。また、使用している関連RDBMSのタグ(製品タグとバージョンタグ)を追加してください。 –

答えて

0
WHERE tp.PromotionCode = @PromotionCode 
AND ((@LocationId IS NOT NULL AND tp.LocationId = @LocationId) OR tp.LocationId IS NULL) 

この条件は、がnullでなく、0でない値を有し、その値が tp.LocationIdと一致する必要がある、そうでなければ、それは tp.LocationIdがあるものを返し@LocationIdそれらの値を選択しますヌル。 結果はあなたが望むものですか?別の場合は教えてください