sql >> Database >  >> RDS >> Sqlserver

Twee bitmaskers in SQL vergelijken om te zien of een van de bits overeenkomt

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


  1. Hoe gebruik ik een globale tijdelijke tabel in de Oracle-procedure?

  2. Een tabel maken met een externe sleutel in SQL

  3. Het maken van een 32-bits ODP.Net OracleConnection-object is erg traag

  4. Groepsdata in een foreach-lus