Побитовый запрос умножает значения - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу выполнить запрос с побитовым в 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 голосов
/ 20 февраля 2019

Поскольку вам интересно проверить, установлен ли какой-либо из битов понедельника, среды или воскресенья, вам нужно использовать маску 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 голосов
/ 20 февраля 2019

Если вы хотите увидеть, присутствуют ли все три дня, выполните:

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

Если вы хотите что-либо, то:

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

Примечание: я не рекомендуюиспользуя битовые столбцы для этой цели.Битовые операции не особенно эффективны в SQL.

0 голосов
/ 20 февраля 2019

Если все остальное в порядке, то, вероятно, это будет ваш ответ

    go

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

     go

Если это не работает, пожалуйста, поделитесь сообщением об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...