基于@RoleUser变量的SQL WHERE条件逻辑优化求助
SQL条件逻辑优化方案
问题场景
现有一段SQL查询,需求是:仅当@RoleUser变量值属于('A','B')时,才执行MUD.DistributorCode IN (SELECT DistributorCode FROM dbo.MasterUsersDistributor WHERE UserCode = @UserLoginID)这个过滤条件;若@RoleUser不在该范围内,则忽略此条件。
最初尝试的写法无法生效:当@RoleUser为('A','B')时能正常返回结果,但其他角色时返回0条记录,原写法如下:
AND IIF(@RoleUser IN ('A','B'), MUD.DistributorCode, @RoleUser) IN (SELECT DistributorCode FROM dbo.MasterUsersDistributor WHERE UserCode = IIF(@RoleUser IN ('A','B'), @UserLoginID, NULL))
问题原因
当@RoleUser不在('A','B')时,子查询的WHERE条件变为UserCode = NULL。在SQL中,NULL与任何值的比较结果都是UNKNOWN,导致子查询返回空结果集。此时IN空集的条件永远不成立,最终整个WHERE条件不满足,所以返回0条记录。
解决方案
使用OR逻辑组合条件,这是最直观且高效的写法:
WHERE REPLACE(FPS.Name, '@Requestor', uc.Name) <> 'DRAFT' AND ( -- 非A/B角色时,此条件恒成立,跳过DistributorCode过滤 @RoleUser NOT IN ('A','B') OR -- A/B角色时,执行DistributorCode过滤 MUD.DistributorCode IN (SELECT DistributorCode FROM dbo.MasterUsersDistributor WHERE UserCode = @UserLoginID) )
逻辑说明
- 当
@RoleUser不属于('A','B')时,@RoleUser NOT IN ('A','B')为真,整个括号内的条件直接成立,相当于不添加额外过滤; - 当
@RoleUser属于('A','B')时,@RoleUser NOT IN ('A','B')为假,此时会检查第二个条件,执行DistributorCode的过滤逻辑。
也可以用CASE表达式实现,但OR的写法更简洁易读:
WHERE REPLACE(FPS.Name, '@Requestor', uc.Name) <> 'DRAFT' AND CASE WHEN @RoleUser IN ('A','B') THEN CASE WHEN MUD.DistributorCode IN (SELECT DistributorCode FROM dbo.MasterUsersDistributor WHERE UserCode = @UserLoginID) THEN 1 ELSE 0 END ELSE 1 END = 1
内容的提问来源于stack exchange,提问作者Brown_MV
相关产品推荐
相关产品推荐

