如果参数为-1,则选择所有记录

时间:2016-07-28 15:48:25

标签: tsql stored-procedures parameters

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

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

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

问题是当AccountType@AccountTypeId时,SP会返回所有-1

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

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。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

我确信有一种简单的方法来获取所有记录,而我只是过于复杂化了。有人可以指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

你可以使用一个OR语句,如果你发送-1并因此选择所有行,这当然总是为真。

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

答案 1 :(得分:1)

每次我遇到这个要求时(通常是这样),我都会使用SQL Server中的COALESCE函数。 COALESCE返回第一个非null值,因此它会像这样。请注意,@ Param已更改为支持NULL。

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