Ответ 1
Ответ на ваш вопрос заключается в использовании Побитового &
следующим образом:
SELECT * FROM UserTable WHERE Roles & 6 != 0
6
можно обменять на любую комбинацию вашего битового поля, где вы хотите проверить, что любой пользователь имеет один или несколько из этих битов. Когда я пытаюсь проверить это, я обычно считаю полезным написать эту запись в двоичном формате. Ваша пользовательская таблица выглядит так:
1 2 4
------------------
Dave 0 1 1
Charlie 0 1 0
Susan 0 0 1
Nick 1 0 0
Ваш тест (6) - это
1 2 4
------------------
Test 0 1 1
Если мы пройдем через каждого человека, делающего битвейз И против теста мы получим следующее:
1 2 4
------------------
Dave 0 1 1
Test 0 1 1
Result 0 1 1 (6)
Charlie 0 1 0
Test 0 1 1
Result 0 1 0 (2)
Susan 0 0 1
Test 0 1 1
Result 0 0 1 (4)
Nick 1 0 0
Test 0 1 1
Result 0 0 0 (0)
Вышеупомянутое должно продемонстрировать, что любые записи, в которых результат не равен нулю, имеют один или несколько запрошенных флагов.
Изменить: здесь тестовый пример должен проверить этот
with test (id, username, roles)
AS
(
SELECT 1,'Dave',6
UNION SELECT 2,'Charlie',2
UNION SELECT 3,'Susan',4
UNION SELECT 4,'Nick',1
)
select * from test where (roles & 6) != 0 // returns dave, charlie & susan
или
select * from test where (roles & 2) != 0 // returns Dave & Charlie
или
select * from test where (roles & 7) != 0 // returns dave, charlie, susan & nick