按位查询多个值

问题描述 投票:0回答:3

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

谢谢。

sql sql-server bit-manipulation
3个回答
0
投票

如果你想看看是否所有三天都存在,那么:

WHERE (DayBitwise & 1 & 4 & 64) = (1 | 4 | 64)

如果你想要的话,那么:

WHERE (DayBitwise & (1 | 4 | 64)) > 0

注意:我不建议为此目的使用位列。位操作在SQL中不是特别有效。


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

0
投票

如果其他一切都很好,那么这可能是你的答案

    go

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

     go

如果它不工作,那么请分享错误消息。

© www.soinside.com 2019 - 2024. All rights reserved.