Tsql 如果参数为-1,则选择所有记录
我知道这是一个基本问题,但我似乎无法找到正确的搜索词组合来获得我需要的答案 我正在处理一个存储过程,其中有一个名为Tsql 如果参数为-1,则选择所有记录,tsql,stored-procedures,parameters,Tsql,Stored Procedures,Parameters,我知道这是一个基本问题,但我似乎无法找到正确的搜索词组合来获得我需要的答案 我正在处理一个存储过程,其中有一个名为@AccountTypeId的参数。参数可以是1,2,3,或-1。如果@AccountTypeId是-1,它应该返回所有的帐户类型(1、2和3)。我可以很容易地编写一个SP,它将根据@AccountTypeId进行过滤: CREATE PROCEDURE Accounts_SP (@AccountTypeId INT) AS SELECT * FROM Accounts WHERE
@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
问题是当@AccountTypeId
为-1
时,SP返回所有AccountType
s
我尝试在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)
但它给了我以下错误:
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时
我相信有一个简单的方法可以得到所有的记录,我只是把事情复杂化了。有人能给我指出正确的方向吗?您可以使用OR语句,如果您发送-1并选择所有行,这当然总是正确的
SELECT *
FROM Accounts
WHERE AccountTypeId = @AccountTypeId
OR @AccountTypeId = -1
您可以使用OR语句,当然,如果您发送in-1并因此选择所有行,则OR语句总是正确的
SELECT *
FROM Accounts
WHERE AccountTypeId = @AccountTypeId
OR @AccountTypeId = -1
每次我遇到这个需求时(通常是这样),我都会使用SQL Server中的函数。COALESCE返回第一个非空值,因此它将是这样的。注意@Param已更改为支持NULL
CREATE PROCEDURE Accounts_SP (@AccountTypeId INT = NULL)
AS
SELECT *
FROM Accounts
WHERE AccountTypeId = COALESCE(@AccountTypeId, AccountTypeId)
每次我遇到这个需求时(通常是这样),我都会使用SQL Server中的函数。COALESCE返回第一个非空值,因此它将是这样的。注意@Param已更改为支持NULL
CREATE PROCEDURE Accounts_SP (@AccountTypeId INT = NULL)
AS
SELECT *
FROM Accounts
WHERE AccountTypeId = COALESCE(@AccountTypeId, AccountTypeId)
我就知道是这么简单。期限到了我就接受答复。非常感谢。我就知道是这么简单。期限到了我就接受答复。非常感谢。