Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Confrontando due maschere di bit in SQL per vedere se uno qualsiasi dei bit corrisponde

La risposta alla tua domanda è usare Bitwise & così:

SELECT * FROM UserTable WHERE Roles & 6 != 0

Il 6 può essere scambiato con qualsiasi combinazione del tuo campo di bit in cui desideri verificare che qualsiasi utente abbia uno o più di quei bit. Quando provo a convalidarlo, di solito trovo utile scriverlo a mano in binario. La tua tabella utente ha questo aspetto:

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

Il tuo test (6) è questo

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

Se esaminiamo ogni persona che esegue il bitwaise E contro il test otteniamo questi:

        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) 

Quanto sopra dovrebbe dimostrare che qualsiasi record in cui il risultato non è zero ha uno o più dei flag richiesti.

Modifica:ecco il test case se vuoi verificarlo

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

o

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

o

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