SQL ServerWhere子句变量可能为空

Ale*_*lex 5 sql sql-server

我有以下查询(SQL 服务器):

DECLARE @UserId INT;
SET @UserId = //... set by dynamic variable

SELECT *
FROM Users
WHERE userId = @UserId
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果为@UserId空,查询将无法正确评估。

如果变量为空或不为空,如何编写此查询以正确评估?

编辑:

有很多建议使用以下内容:

WHERE (@UserId IS NULL OR userId = @UserId)
Run Code Online (Sandbox Code Playgroud)

或类似。

在这种情况下,如果有一个包含 3 个条目的表,其中 userId 为 1,2 和 3,则变量“@UserId”为 NULL,则此查询将返回所有 3 个条目。我实际上需要它返回的是没有条目,因为它们的 userId 都不为 NULL

PSK*_*PSK 2

阅读编辑后,我认为您希望您的查询像

SELECT *
FROM Users
WHERE COALESCE(userId ,0) = COALESCE(@UserId,0)  
Run Code Online (Sandbox Code Playgroud)

编辑:

正如Gordon LinoffLarnu所指出的,上述查询在性能方面不会很好,因为该查询是“不可 SARGable”的,为了获得更好的性能,相同的查询可以写为

  SELECT *
    FROM Users
    WHERE userId = @UserId OR( userId is null and @UserId is null)
Run Code Online (Sandbox Code Playgroud)