我想WHERE根据输入参数的值更改查询的子句.我猜这是可能的,但似乎我以错误的方式接近它?
我的SP查询的简化版本:
CREATE PROCEDURE [dbo].[GetMailboxMessagesByStatus]
@UserId UNIQUEIDENTIFIER,
@MessageStatus INT
AS
BEGIN
SELECT *
FROM MailboxMessages m
WHERE
CASE @MessageStatus
WHEN 4 THEN m.SenderId = @UserId --Sent
ELSE m.RecipientId = @UserId --Inbox
END
END
GO
Run Code Online (Sandbox Code Playgroud)
不需要case或iif结构:
WHERE @MessageStatus = 4 AND m.SenderId = @UserId
OR @MessageStatus <> 4 AND m.RecipientId = @UserId
Run Code Online (Sandbox Code Playgroud)
编辑:当被查询的表非常大时,请注意使用此结构的大表.使用像Chester Lim这样的IF语句使用2个单独的查询可能是更好的解决方案.防止参数嗅探也可能是一个好主意
您可以将该 WHERE 子句更改为
WHERE (CASE WHEN @MessageStatus = 4 THEN m.SenderId ELSE m.RecipientId END) = @UserId
Run Code Online (Sandbox Code Playgroud)
因为 CASE 中 THEN 之后的内容应该只是一个值,而不是一个比较。
或者使用 IIF 而不是 CASE:
WHERE IIF(@MessageStatus = 4,m.SenderId,m.RecipientId) = @UserId
Run Code Online (Sandbox Code Playgroud)
但是,如果您使用 IF ... ELSE ... 并根据 @MessageStatus 运行不同的查询,SQL 将运行得更高效。
正在为此写一个例子,但 Chester Lim 已经抢先了我。;)
(因此无需在此答案中重复该方法)