【问题标题】:Select all records if parameter is -1如果参数为-1,则选择所有记录
【发布时间】:2016-12-03 03:04:28
【问题描述】:

我知道这是一个基本问题,但我似乎无法想出正确的搜索词组合来获得我需要的答案。

我正在处理一个存储过程,其中有一个名为@AccountTypeId 的参数。参数可以是123-1。如果@AccountTypeId-1,它应该返回所有 帐户类型(123)。我可以很容易地编写一个 SP 来根据@AccountTypeId 进行过滤:

CREATE PROCEDURE Accounts_SP (@AccountTypeId INT)
AS
SELECT *
FROM Accounts
WHERE AccountTypeId = @AccountTypeId

问题是当@AccountTypeId-1 时,SP 返回所有AccountTypes。

我尝试在 WHERE 子句中使用 CASE 语句,如下所示:

CREATE PROCEDURE Accounts_SP (@AccountTypeId INT)
AS
SELECT *
FROM Accounts
WHERE AccountTypeId IN (CASE @AccountTypeId WHEN -1
                            THEN (SELECT AccountTypeId FROM AccountTypes) 
                            ELSE @AccountTypeId 
                        END)

但它给了我以下错误:

子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

我确信有一种简单的方法可以获取所有记录,但我只是让事情变得过于复杂。有人可以指出我正确的方向吗?

【问题讨论】:

    标签: tsql stored-procedures parameters


    【解决方案1】:

    您可以使用 OR 语句,如果您发送 -1 并因此选择所有行,那么这当然总是正确的。

    SELECT *
    FROM Accounts
    WHERE AccountTypeId = @AccountTypeId
    OR @AccountTypeId = -1
    

    【讨论】:

    • 我知道这很简单。我会在时限结束后接受答案。谢谢!!
    【解决方案2】:

    每次我遇到这个需求(而且经常如此)时,我都会使用 SQL Server 中的COALESCE 函数。 COALESCE 返回第一个非空值,所以它会像这样。请注意,@Param 已更改为支持 NULL。

    CREATE PROCEDURE Accounts_SP (@AccountTypeId INT = NULL)
    AS
    SELECT *
    FROM Accounts
    WHERE AccountTypeId = COALESCE(@AccountTypeId, AccountTypeId)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多