Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Vergleichen von zwei Bitmasken in SQL, um zu sehen, ob eines der Bits übereinstimmt

Die Antwort auf Ihre Frage ist die Verwendung von Bitwise & so:

SELECT * FROM UserTable WHERE Roles & 6 != 0

Die 6 kann gegen eine beliebige Kombination Ihres Bitfelds ausgetauscht werden, wenn Sie überprüfen möchten, ob jeder Benutzer über eines oder mehrere dieser Bits verfügt. Wenn ich versuche, dies zu validieren, finde ich es normalerweise hilfreich, dies in Binärform zu schreiben. Ihre Benutzertabelle sieht so aus:

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

Ihr Test (6) ist dieser

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

Wenn wir jede Person durchgehen, die das Bitwaise Und gegen den Test durchführt, erhalten wir diese:

        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) 

Das Obige sollte zeigen, dass alle Datensätze, bei denen das Ergebnis nicht Null ist, eines oder mehrere der angeforderten Flags haben.

Bearbeiten:Hier ist der Testfall, falls Sie dies überprüfen möchten

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

oder

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

oder

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