我有以下查询(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
阅读编辑后,我认为您希望您的查询像
SELECT *
FROM Users
WHERE COALESCE(userId ,0) = COALESCE(@UserId,0)
Run Code Online (Sandbox Code Playgroud)
编辑:
正如Gordon Linoff和Larnu所指出的,上述查询在性能方面不会很好,因为该查询是“不可 SARGable”的,为了获得更好的性能,相同的查询可以写为
SELECT *
FROM Users
WHERE userId = @UserId OR( userId is null and @UserId is null)
Run Code Online (Sandbox Code Playgroud)