Het antwoord op uw vraag is om de Bitwise &
. te gebruiken zoals dit:
SELECT * FROM UserTable WHERE Roles & 6 != 0
De 6
kan worden ingewisseld voor elke combinatie van uw bitveld waar u wilt controleren of een gebruiker een of meer van die bits heeft. Als ik dit probeer te valideren, vind ik het meestal handig om dit met de hand in binair getal op te schrijven. Uw gebruikerstabel ziet er als volgt uit:
1 2 4
------------------
Dave 0 1 1
Charlie 0 1 0
Susan 0 0 1
Nick 1 0 0
Je test (6) is dit
1 2 4
------------------
Test 0 1 1
Als we door elke persoon gaan die de bitwaise doet En tegen de test krijgen we deze:
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)
Het bovenstaande zou moeten aantonen dat alle records waarvan het resultaat niet nul is, een of meer van de gevraagde vlaggen hebben.
Bewerken:hier is de testcase als je dit wilt controleren
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
of
select * from test where (roles & 2) != 0 // returns Dave & Charlie
of
select * from test where (roles & 7) != 0 // returns dave, charlie, susan & nick