首页 > 解决方案 > 在 SQL 中分解位掩码

问题描述

我有一个使用位掩码的旧数据库设计。我有一个包含电子邮件地址和基于另一个表的位掩码的表,并且我的任务是编写一个 SQL 查询来“分解”这些位掩码。通常,以不同的方式查看此数据,我们使用按位 & 来确定位掩码是否有效,但这次不是这种情况......

在我的数据的简化版本中,我有 2 个这样的字段。

|---------------------|------------------|
|      Email          |     bitMask      |
|---------------------|------------------|
|     test@test.com   |        3         |
|---------------------|------------------|
|    test2@test.com   |        9         |
|---------------------|------------------| 

我最终要查找的输出将显示“2 的幂”或到达位掩码所需的“位”,因此我可以在另一个表中交叉引用掩码值。所以我的示例输出是这样的:

|---------------------|------------------|
|      Email          |     value        |
|---------------------|------------------|
|     test@test.com   |        2         |
|---------------------|------------------|
|     test@test.com   |        1         |
|---------------------|------------------|
|    test2@test.com   |        8         |
|---------------------|------------------| 
|    test2@test.com   |        1         |
|---------------------|------------------| 

这是我用来处理位掩码的相反方式。如果有人知道如何编写此查询,我们将不胜感激。

标签: sqlsql-serverbit

解决方案


使用&(按位 AND 运算符), with0xFFFFFFFE获得2部分的1和 with获得第一个二进制数字 (01):

select [Email], [bitMask] & 0xFFFFFFFE [value]
from tablename  
union all
select [Email], [bitMask] & 1
from tablename  
order by [Email], [value] desc

请参阅演示
结果:

> Email          | value
> :------------- | ----:
> test@test.com  |     2
> test@test.com  |     1
> test2@test.com |     8
> test2@test.com |     1

推荐阅读