Отговорът на вашия въпрос е да използвате побитовия &
като това:
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
Ако преминем през всеки човек, който прави bitwaise и срещу теста, получаваме следното:
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