Svaret på din fråga är att använda Bitwise &
så här:
SELECT * FROM UserTable WHERE Roles & 6 != 0
6
kan bytas ut mot valfri kombination av ditt bitfält där du vill kontrollera att någon användare har en eller flera av dessa bitar. När jag försöker validera detta tycker jag vanligtvis att det är till hjälp att skriva ut det här i binärt format. Din användartabell ser ut så här:
1 2 4
------------------
Dave 0 1 1
Charlie 0 1 0
Susan 0 0 1
Nick 1 0 0
Ditt test (6) är detta
1 2 4
------------------
Test 0 1 1
Om vi går igenom varje person som gör bitwaise Och mot testet får vi dessa:
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)
Ovanstående bör visa att alla poster där resultatet inte är noll har en eller flera av de begärda flaggorna.
Edit:Här är testfallet om du vill kontrollera detta
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
eller
select * from test where (roles & 2) != 0 // returns Dave & Charlie
eller
select * from test where (roles & 7) != 0 // returns dave, charlie, susan & nick