2017-04-17 6 views
1

次の条件があります。SQL Where句が値渡しの場合に使用

値が@UserIdパラメータに渡された場合、それらのフィルタをフィルタリングする必要があります( )。

値が渡されない場合は、すべてのレコードを取得する必要があります。

列RecipientIdがNULLでないです。

しかし、私は値を渡しても、以下のクエリは常にすべてのレコードを返します。

私はあなたがIDに

DECLARE @UserId INT 

SET @UserId = 47 

SELECT * 
FROM Message MR 
WHERE MR.CompanyId = 1 
    AND MR.RecipientId = @UserId 

を提供するので何のidが

SELECT * 
FROM Message MR 
WHERE MR.CompanyId = 1 
    AND (
     @UserId IS NULL 
     OR MR.RecipientId = @UserId -- OR get this one, redundant 
     ) 

なぜ提供されていない場合は、シンプルなフォームを使用することができると信じて

DECLARE @UserId INT 

SET @UserId = 47 

SELECT * 
FROM Message MR 
WHERE MR.CompanyId = 1 
    AND (
     MR.RecipientId IS NOT NULL 
     OR MR.RecipientId = @UserId 
     ) 
+0

変更は '' null'なのであるにNULL'ではありません。 – user1935361

+0

@ user1935361レコードが常にいくつかのidを指しているので、 'nullである 'というレコードは表示されない – Developer

答えて

5

だけで使用することをあなたのVariab上のブール式ル

declare @UserId int = null 

SELECT * 
FROM Message MR 
WHERE MR.CompanyId = 1 and (MR.RecipientID = @UserId or @UserId IS NULL) 
+0

私の列 '列RecipientIdは問題ではありません。そのレコードが表示されていないことを表示 – Developer

+2

その列がNULLかどうかは関係ありません。パラメータがNULLの場合、OR条件が満たされ、すべてのMR.RecipientIDが返されます。 NULL <> NULLとなるため、この演算子とは無関係な列の能力はありません。 – scsimon

+0

優れています。できます! – Developer

0

SELECT * 
FROM Message MR 
WHERE MR.CompanyId = 1 
    AND (
     MR.RecipientId IS NOT NULL -- get All NOT NULL *(basically all) 
     OR MR.RecipientId = @UserId -- OR get this one, redundant 
     ) 
+0

他のユースケースでは、私のプロシージャにIDを渡すことはできません。私はその事件を処理する必要があります – Developer

0

1つのより多くの選択肢があり、効率的ではないかもしれない、見て:

DECLARE @UserId INT 

SET @UserId = 47 

SELECT * 
FROM Message MR 
WHERE MR.CompanyId = 1 
    AND MR.RecipientId = (
     CASE 
      WHEN @UserId IS NULL 
       THEN MR.RecipientId 
      ELSE @UserId 
      END 
     )