查询根据结果集中一行中的匹配 id 设置变量

Ray*_*boe 0 sql t-sql sql-server

给定每个角色一行的结果集,如何设置三个变量,例如 IsAdmin、IsSuperUser、IsUser。

我尝试过这个,但它太难看了。我想只用一个查询来完成同样的任务。我知道如何将它们组合成一个包含三个子查询的查询,但如果可能的话,我想只使用一个查询。

declare @IsAdmin bit, @IsSuperUser bit, @IsUser bit
select RoleId into #CallerRoles from AspNetUserRoles aur where aur.UserId = @CallerUserId 
set @IsAdmin = case when exists (select * from #CallerRoles where RoleId = 1) then 1 else 0 end
set @IsSuperUser = case when exists (select * from #CallerRoles where RoleId = 3) then 1 else 0 end
set @IsUser = case when exists (select * from #CallerRoles where RoleId = 5) then 1 else 0 end
Run Code Online (Sandbox Code Playgroud)

xXx*_*xXx 5

如果您想在一个查询中设置变量IsAdminIsSuperUser、 和IsUser,您可以使用条件聚合,如下所示:

DECLARE @IsAdmin BIT, @IsSuperUser BIT, @IsUser BIT

SELECT
    @IsAdmin = MAX(CASE WHEN RoleId = 1 THEN 1 ELSE 0 END),
    @IsSuperUser = MAX(CASE WHEN RoleId = 3 THEN 1 ELSE 0 END),
    @IsUser = MAX(CASE WHEN RoleId = 5 THEN 1 ELSE 0 END)
FROM
    AspNetUserRoles
WHERE
    UserId = @CallerUserId
Run Code Online (Sandbox Code Playgroud)

在此查询中,该MAX函数与内部条件表达式 ( ) 一起使用CASE WHEN。每个条件表达式都会检查RoleId并根据条件分配 1 或 0。然后将每个结果进行聚合MAX以获得每个变量的单个值。

请注意,该查询假定AspNetUserRoles表包含列RoleIdUserId,它们用于过滤数据。根据您的架构调整表和列名称。