在SQL中破坏位掩码

问题描述 投票:0回答:1

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

在我的数据的简化版本中,我有两个类似的字段。

|---------------------|------------------|
|      Email          |     bitMask      |
|---------------------|------------------|
|     [email protected]   |        3         |
|---------------------|------------------|
|    [email protected]   |        9         |
|---------------------|------------------| 

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

|---------------------|------------------|
|      Email          |     value        |
|---------------------|------------------|
|     [email protected]   |        2         |
|---------------------|------------------|
|     [email protected]   |        1         |
|---------------------|------------------|
|    [email protected]   |        8         |
|---------------------|------------------| 
|    [email protected]   |        1         |
|---------------------|------------------| 

这是我用来处理位掩码的相反方法。如果有人知道如何编写此查询,请提供任何建议。

sql sql-server bit
1个回答
0
投票

使用&(按位与运算符),用0xFFFFFFFE获得2的幂]部分,用1获得第一个二进制数(01):

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

请参见demo。结果:

> Email          | value
> :------------- | ----:
> [email protected]  |     2
> [email protected]  |     1
> [email protected] |     8
> [email protected] |     1
© www.soinside.com 2019 - 2024. All rights reserved.