【发布时间】:2021-07-22 15:32:45
【问题描述】:
这可能是@saeedehp 回答的后续问题Enum Join。我有一个充满枚举值的表,它们连接在一起以在另一个表中构建一些用户角色列。
例子
表 1 枚举表
Role - RoleEnumValue
-------------------------
Student - 1
Researcher - 2
Lecturer - 4
Teacher - 8
表 2 用户表
UserName - Roles
-------------------------
John - 3
Melvin - 14
结果
UserName - UserRoles
--------------------------------
John - Student, Researcher
Melvin - Researcher, Lecturer, Teacher
这是获取结果的 sql 查询。但是我需要为表 1 中的每一行编写 switch case
SELECT t.UserName
, ISNULL(t.C1 + ', ', '') + ISNULL(t.C2, '') + ISNULL(', ' + t.C3, '') +
ISNULL(', ' + t.C3, '') AS [UserRoles]
FROM
(
SELECT UserName,
CASE WHEN (Roles & 1) <> 0 THEN 'Student' END AS C1,
CASE WHEN (Roles & 2) <> 0 THEN 'Researcher' END AS C2,
CASE WHEN (Roles & 4) <> 0 THEN 'Lecturer' END AS C3,
CASE WHEN (Roles & 8) <> 0 THEN 'Teacher' END AS C3
,... -- if i have more rows
FROM "Table 2"
) t
现在的问题是我的表 1 有大约 14 到 20 个角色,继续添加 switch case 没有效率。
提取多个角色并获得上述结果的另一种方法是什么? 能否指出这可能属于哪个维恩图?
(我使用的是 Microsoft SQL Server)
更新
我想我要解决的问题是快速找到用户角色,而不需要打开应用逐个检查用户。
@Gordon Linoff 的精彩回答,
@MatBailie 的另一个很棒的答案,它让我意识到答案很简单。
解决办法。
SELECT
u.UserName,
STRING_AGG(r.Role, ',') AS AssignedRoles
FROM "Table 2" u
LEFT JOIN "Table 1" r ON r.RoleEnumValue & u.Roles <> 0
GROUP BY u.UserName
【问题讨论】:
-
很明显这是一个常见问题解答。在考虑发布之前,请阅读手册和谷歌任何错误消息以及您的问题/问题/目标的许多清晰、简洁和精确的措辞,带有和不带有您的特定名称/字符串/数字、“site:stackoverflow.com”和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。 PS 当您发布代码问题时,它应该包含minimal reproducible example。
-
能否重新设计数据库结构?将关系编码为位并不好 - 它可以节省空间,但会使任何不必要的查询难以编写。
-
@Arvo,我无法控制设计,这是旧的设计风格,它符合要求。我只是尝试通过简化反向检查来使事情变得更容易
标签: sql sql-server tsql join