T-SQL根据输入参数的值使用不同的WHERE子句

Pix*_*aul 4 t-sql sql-server

我想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)

MWi*_*mse 9

不需要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个单独的查询可能是更好的解决方案.防止参数嗅探也可能是一个好主意

  • 在这个答案中如何使用括号? (5认同)

Luk*_*rms 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 已经抢先了我。;)
(因此无需在此答案中重复该方法)