2017-04-17 62 views
1

我有以下条件。SQL Where子句如果通过值使用

如果一个值传递给@UserId参数,我需要过滤那些 用户记录。

如果没有值通过,那么我需要把所有的记录。

列RecipientId不为空

但是,即使我传递值,下面的查询总是返回所有记录。

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 – Developer

回答

5

只需使用变量上的布尔表达式乐

declare @UserId int = null 

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

正如我给出我的列'列RecipientId是不是NULL'的问题。显示其没有显示任何记录 – Developer

+2

如果该列为空或不是无关紧要。如果参数为NULL,则满足OR条件并返回所有MR.RecipientID。 NULL <>无论如何NULL,因此您的列的无效性与此运算符无关。 – scsimon

+0

非常好。有用! – Developer

0

我相信你可以使用一个简单的形式,因为您提供的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 
     ) 

为什么:

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

有一个比较另类,可能不是有效的,看看:

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 
     )