我知道这是一个基本问题,但我似乎无法找到正确的搜索词组合来获得我需要的答案。
我正在处理存储过程,其中有一个名为@AccountTypeId
的参数。参数可以是1
,2
,3
或-1
。如果@AccountTypeId
为-1
,则应返回所有帐户类型(1
,2
和3
)。我可以轻松地编写一个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。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。
我确信有一种简单的方法来获取所有记录,而我只是过于复杂化了。有人可以指出我正确的方向吗?
答案 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)