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