Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comparaison de deux masques de bits en SQL pour voir si l'un des bits correspond

La réponse à votre question est d'utiliser le bitwise & comme ceci :

SELECT * FROM UserTable WHERE Roles & 6 != 0

Le 6 peut être échangé contre n'importe quelle combinaison de votre champ de bits où vous souhaitez vérifier qu'un utilisateur possède un ou plusieurs de ces bits. Lorsque j'essaie de valider cela, je trouve généralement utile d'écrire cela à la main en binaire. Votre table utilisateur ressemble à ceci :

        1   2   4
------------------
Dave    0   1   1
Charlie 0   1   0
Susan   0   0   1   
Nick    1   0   0

Votre test (6) est celui-ci

        1   2   4
------------------
Test    0   1   1

Si nous passons en revue chaque personne faisant le bitwaise Et contre le test, nous obtenons ceci :

        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) 

Ce qui précède doit démontrer que tous les enregistrements dont le résultat n'est pas zéro ont un ou plusieurs des indicateurs demandés.

Edit :Voici le cas de test si vous souhaitez vérifier cela

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

ou

select * from test where (roles & 2) != 0 // returns Dave & Charlie

ou

select * from test where (roles & 7) != 0 // returns dave, charlie, susan & nick