Odpowiedzią na twoje pytanie jest użycie Bitwise &
tak:
SELECT * FROM UserTable WHERE Roles & 6 != 0
6
można wymienić na dowolną kombinację twojego pola bitowego, w którym chcesz sprawdzić, czy dowolny użytkownik ma jeden lub więcej z tych bitów. Kiedy próbuję to sprawdzić, zwykle uważam, że pomocne jest napisanie tego odręcznie w formacie binarnym. Twoja tabela użytkowników wygląda tak:
1 2 4
------------------
Dave 0 1 1
Charlie 0 1 0
Susan 0 0 1
Nick 1 0 0
Twój test (6) jest taki
1 2 4
------------------
Test 0 1 1
Jeśli przejdziemy przez każdą osobę wykonującą bitwaise I w porównaniu z testem otrzymamy następujące:
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)
Powyższe powinno wykazać, że wszelkie rekordy, w których wynik nie jest zerem, mają co najmniej jedną z żądanych flag.
Edycja:Oto przypadek testowy, jeśli chcesz to sprawdzić
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
lub
select * from test where (roles & 2) != 0 // returns Dave & Charlie
lub
select * from test where (roles & 7) != 0 // returns dave, charlie, susan & nick