我有一个正在使用的旧数据库设计,该设计使用位掩码。我有一个表,该表包含另一个地址的电子邮件地址和一个位掩码,并且受命编写“分解”这些位掩码的SQL查询。通常,以不同的方式查看此数据,我们使用按位&来确定位掩码是否有效,但这次不是这种情况...
在我的数据的简化版本中,我有两个类似的字段。
|---------------------|------------------|
| Email | bitMask |
|---------------------|------------------|
| [email protected] | 3 |
|---------------------|------------------|
| [email protected] | 9 |
|---------------------|------------------|
我最终要寻找的输出将显示到达位掩码所需的“ 2的幂”或“位”,因此我可以交叉引用另一个表中的掩码值。所以我的示例输出是这样的:
|---------------------|------------------|
| Email | value |
|---------------------|------------------|
| [email protected] | 2 |
|---------------------|------------------|
| [email protected] | 1 |
|---------------------|------------------|
| [email protected] | 8 |
|---------------------|------------------|
| [email protected] | 1 |
|---------------------|------------------|
这是我用来处理位掩码的相反方法。如果有人知道如何编写此查询,请提供任何建议。
使用&
(按位与运算符),用0xFFFFFFFE
获得2的幂]部分,用1
获得第一个二进制数(0
或1
):
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