我想在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
谢谢。
如果你想看看是否所有三天都存在,那么:
WHERE (DayBitwise & 1 & 4 & 64) = (1 | 4 | 64)
如果你想要的话,那么:
WHERE (DayBitwise & (1 | 4 | 64)) > 0
注意:我不建议为此目的使用位列。位操作在SQL中不是特别有效。
由于您有兴趣检查是否设置了任何星期一,星期三或星期日位,您需要使用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
如果其他一切都很好,那么这可能是你的答案
go
SELECT Distinct DayBitwise FROM Assets
WHERE DayBitwise | 1 | 4 | 64 = 1 | 4 | 64
ORDER BY DayBitwise
go
如果它不工作,那么请分享错误消息。