sql - 展平枚举表中的 T-SQL 位掩码

标签 sql sql-server t-sql pivot

我正在尝试展平存储在位掩码中的函数列表,这些函数在枚举表中进行“解释”,如下所示:

CREATE TABLE #enum([ID] [int] NOT NULL IDENTITY(1, 1) PRIMARY KEY,
                   [Display] [varchar] (50) NOT NULL,
                   [DataValue] [int] NOT NULL);

INSERT INTO [#enum] ([Display], [DataValue]) 
SELECT  'Function A', 1 
UNION SELECT 'Function B', 2 
UNION SELECT 'Function C', 4 
UNION SELECT 'Function D', 8 
UNION SELECT 'Function E', 16
UNION SELECT 'Function F', 32 
UNION SELECT 'Function G', 64;

我的数据表如下所示(显然大大简化了):

CREATE TABLE #people ([ID] [int] NOT NULL IDENTITY(1, 1) PRIMARY KEY,
                      [PersonName] [varchar] (50) NOT NULL,
                      [Functions] [int] NOT NULL);

INSERT INTO [#people] ([PersonName], [Functions]) 
SELECT'Ken Hurt', 8 
UNION SELECT 'Justin Case', 33 
UNION SELECT 'Bill Board', 73;

现在我想在查询 #people 表时返回以逗号分隔的函数列表;结果是这样的:

ID        Name          Functions
1         Ken Hurt      Function D
2         Justin Case   Function A, Function F
3         Bill Board    Function A, Function D, Function G

我已经研究动态 SQL、PIVOTSTUFF()FOR XML PATH() 有一段时间了,但是我显然太愚蠢了,无法消化这个概念的美丽。能否请你帮忙?使用 WHILE 或更糟糕的 Cursors 浏览列表似乎就像拿着大锤来破解坚果一样。谢谢!

最佳答案

正确方法:

架构“损坏”。将其标准化。


解决方法:

不需要WHILE/CURSOR/PIVOT/Dynamic-SQL。简单的按位运算就可以完成这项工作:

SELECT *
FROM #people p
CROSS APPLY(SELECT STUFF((SELECT ',' + e.Display
                          FROM #enum e
                          WHERE p.Functions & DataValue = DataValue
                          ORDER BY e.DataValue
                          FOR XML PATH('')), 1, 1, '')
           ) AS sub(result);

LiveDemo

输出:

╔════╦═════════════╦═══════════╦══════════════════════════════════╗
║ ID ║ PersonName  ║ Functions ║              result              ║
╠════╬═════════════╬═══════════╬══════════════════════════════════╣
║  1 ║ Bill Board  ║        73 ║ Function A,Function D,Function G ║
║  2 ║ Justin Case ║        33 ║ Function A,Function F            ║
║  3 ║ Ken Hurt    ║         8 ║ Function D                       ║
╚════╩═════════════╩═══════════╩══════════════════════════════════╝

关于sql - 展平枚举表中的 T-SQL 位掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36747345/

相关文章:

sql - 特定sql注入(inject)说明

php - 从下拉列表中选择多个项目并发送到数据库

SQL server 做类似 Group By 任务

sql - 如何使用Powershell 3.0在SQL Server 2008 R2中填写日期?

sql-server - T-SQL 组跳过并采取

sql - 如何检查分配给 oracle 数据库中模式、角色的对象的权限(DDL、DML、DCL)?

sql - 使用 Case 语句时 MIN 和 MAX 的问题

sql - 如何在 Azure SQL 数据仓库中解析 JSON 格式的字符串?

sql - 如何有效地反转多对多 SQL 查询?

sql - 如何使用 group by 计算总和?