按位查询倍数值

时间:2019-02-20 12:10:31

标签: sql sql-server bit-manipulation

我想在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

谢谢。

3 个答案:

答案 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中不是特别有效。