首页 > 解决方案 > 按位查询倍数值

问题描述

我想在 SQL Server 中按位执行查询。

我有一个包含所有组合值的事件表。

如果星期一是 (2^0) 1,而星期日是 (2^6) 64,我想要星期一、星期三和星期日的所有记录,我写这个查询:

SELECT Distinct(DayBitwise)
FROM Assets
WHERE DayBitwise | 1 | 4 | 64 = 1 | 4 | 64
ORDER BY DayBitwise

预期结果:

1, 3, 4, 5, 6, 7, 9, 11, 12, 13, 15, 17, 19, 20, 21, 23, 25, 27, 28, 29, 31 ....

实际结果:1,4 ,5, 64, 65, 68

谢谢。

标签: sqlsql-serverbit-manipulation

解决方案


由于您有兴趣检查是否设置了任何星期一、星期三或星期日位,因此您需要使用 AND 掩码并且结果非零:

WITH assets(DayBitwise) AS (
    SELECT number
    FROM master..spt_values
    WHERE type = 'p' AND number BETWEEN 0 AND 127
)
SELECT *
FROM assets
WHERE DayBitwise & (1 | 4 | 64) <> 0

推荐阅读