【问题标题】:SQL Where clause use if value passed如果值传递,SQL Where 子句使用
【发布时间】:2017-04-17 14:44:31
【问题描述】:

我有以下情况。

如果将值传递给@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
        )

【问题讨论】:

  • is not null 更改为is null
  • @user1935361 is null 不显示任何记录,因为记录总是指向某个 id

标签: sql sql-server tsql sql-server-2014


【解决方案1】:

只需对变量使用布尔表达式

declare @UserId  int = null

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

【讨论】:

  • 我认为我的专栏 Column RecipientId is NOT NULL 有问题。显示它不显示任何记录
  • 该列是否为空都没有关系。如果参数为 NULL,则满足 OR 条件并返回所有 MR.RecipientID。 NULL NULL 无论如何,所以你的列的空能力与这个运算符无关。
【解决方案2】:

我相信您可以使用更简单的表单,因为您提供了 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
        )

【讨论】:

  • 另一个用例,我不会使用或将 Id 传递给我的程序。我需要处理那个案子
【解决方案3】:

还有一个替代方案,可能效率不高,看看:

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
        )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2012-08-08
    相关资源
    最近更新 更多