Svaret på dit spørgsmål er at bruge Bitwise &
sådan her:
SELECT * FROM UserTable WHERE Roles & 6 != 0
6
kan ombyttes til en hvilken som helst kombination af dit bitfelt, hvor du vil kontrollere, at enhver bruger har en eller flere af disse bits. Når jeg forsøger at validere dette, finder jeg det normalt nyttigt at skrive dette ud på lang hånd i binært. Din brugertabel ser sådan ud:
1 2 4
------------------
Dave 0 1 1
Charlie 0 1 0
Susan 0 0 1
Nick 1 0 0
Din test (6) er denne
1 2 4
------------------
Test 0 1 1
Hvis vi gennemgår hver person, der laver bitwaise, og mod testen får vi disse:
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)
Ovenstående skulle vise, at alle poster, hvor resultatet ikke er nul, har et eller flere af de anmodede flag.
Rediger:Her er testcasen, hvis du vil tjekke dette
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