将按位数据转换为多列

Convert bitwise data into multiple columns

我继承了需要清理的用户数据。它最初位于 MS Access 数据库中,我需要将其转换为 SQL 服务器。我现在在 SQL 服务器中有 table,但是有一列数据我需要帮助。

有很多列,例如姓名、电子邮件等,都非常简单。

但是,有一列存储按位数据。此列用于显示用户可以属于的组。通过查看大量记录,我确定这些组及其相关编号为:

All     1
Air     2
Plants  4
Energy  8
Land    16
Elec    32
Fire    64
Water   128
Cloud   256
Soil    512
Waste   1024
Local   2048
Coast   4096

user 列中的数据可以是 2,如果他们属于 Air 组,或者当他们同时属于 Air 和 Plants (2 + 4) 时,它可以是 6。

我创建了一个包含用户 ID 字段的 table。

User_ID
All 
Air
Plants
Energy
Land
Elec
Fire
Water
Cloud
Soil
Waste
Local
Coast

所以我需要遍历旧的table,然后相应地在新的table的列中插入一个相应的真值

因此,如果数据是:

  User_ID    Name       Group
        1    Jo Smith       2
        2    Carl White     8

我最终会得到

User_ID    All    Air    Plants    Energy   ....
      1           true          
      2                            true

等等。

但是,由于用户可以属于多个组,因此数据看起来更像这样:

Jake    C   1552
Jeff    H   1556
Cath    B   1561
Emma    B   1564
Alex    G   1572
Alan    H   1574
Jo      L   1596
Roy     A   1600

我该如何构建我的新 table?我曾想过

SELECT * FROM [dbo].[Users] where [Group] & 2 != 0 

会开始按照我需要的方式带回数据,但我不确定这是否正确。

编辑:如果需要的话,我愿意使用外部代码 - 不一定非要使用 SQL commands/queries

select      user_id

           ,sign ([Group] &  1   ) as [All]     
           ,sign ([Group] &  2   ) as [Air]     
           ,sign ([Group] &  4   ) as [Plants]  
           ,sign ([Group] &  8   ) as [Energy]  
           ,sign ([Group] &  16  ) as [Land]   
           ,sign ([Group] &  32  ) as [Elec]    
           ,sign ([Group] &  64  ) as [Fire]    
           ,sign ([Group] &  128 ) as [Water]   
           ,sign ([Group] &  256 ) as [Cloud]   
           ,sign ([Group] &  512 ) as [Soil]    
           ,sign ([Group] &  1024) as [Waste]   
           ,sign ([Group] &  2048) as [Local]   
           ,sign ([Group] &  4096) as [Coast]   

from        [dbo].[Users]

select      user_id

           ,sign ([Group] &  power(2, 0)) as [All]     
           ,sign ([Group] &  power(2, 1)) as [Air]     
           ,sign ([Group] &  power(2, 2)) as [Plants]  
           ,sign ([Group] &  power(2, 3)) as [Energy]  
           ,sign ([Group] &  power(2, 4)) as [Land]   
           ,sign ([Group] &  power(2, 5)) as [Elec]    
           ,sign ([Group] &  power(2, 6)) as [Fire]    
           ,sign ([Group] &  power(2, 7)) as [Water]   
           ,sign ([Group] &  power(2, 8)) as [Cloud]   
           ,sign ([Group] &  power(2, 9)) as [Soil]    
           ,sign ([Group] &  power(2,10)) as [Waste]   
           ,sign ([Group] &  power(2,11)) as [Local]   
           ,sign ([Group] &  power(2,12)) as [Coast]   

from        [dbo].[Users]

select      u.*
           ,[All] + [Air] + [Plants] + [Energy] + [Land] + [Elec] + [Fire] + [Water] + [Cloud] + [Soil] + [Waste] + [Local] + [Coast]       as cnt

from       (select      user_id

                       ,sign ([Group] &  power(2, 0)) as [All]     
                       ,sign ([Group] &  power(2, 1)) as [Air]     
                       ,sign ([Group] &  power(2, 2)) as [Plants]  
                       ,sign ([Group] &  power(2, 3)) as [Energy]  
                       ,sign ([Group] &  power(2, 4)) as [Land]   
                       ,sign ([Group] &  power(2, 5)) as [Elec]    
                       ,sign ([Group] &  power(2, 6)) as [Fire]    
                       ,sign ([Group] &  power(2, 7)) as [Water]   
                       ,sign ([Group] &  power(2, 8)) as [Cloud]   
                       ,sign ([Group] &  power(2, 9)) as [Soil]    
                       ,sign ([Group] &  power(2,10)) as [Waste]   
                       ,sign ([Group] &  power(2,11)) as [Local]   
                       ,sign ([Group] &  power(2,12)) as [Coast]  

            from        [dbo].[Users]
            ) u
;