sql - 在 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 |
|---------------------|------------------|
这是我用来处理位掩码的相反方式。如果有人知道如何编写此查询,我们将不胜感激。
解决方案
使用&
(按位 AND 运算符), with0xFFFFFFFE
获得2部分的幂1
和 with获得第一个二进制数字 (0
或1
):
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
推荐阅读
- emulation - 在 QEMU 中运行 MLO 文件
- android - 如何将 MP3 文件转换为八位字节流以将其作为 POST 请求发送
- javascript - 如何根据传递给方法参数的数字为数组定义新的原型方法以进行计数?
- macos - MAC OS 显示中的半透明“水印”
- c# - FakeItEasy - 预计会找到一次或多次,但没有调用假对象
- javascript - 如果电子邮件未使用我的功能验证,则阻止提交表单
- python - 如何将用户输入从一个文件附加到另一个 Python
- django - 如何使用 ajax 更新按钮和计数而不重定向?
- c# - 将具有 Action/Func 参数的同步方法转换为异步
- swiftui - 实现 TextField 时无法推断通用参数“C0”