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

Sammenligning af to bitmasker i SQL for at se, om nogen af ​​bitsene matcher

Svaret på dit spørgsmål er at bruge Bitwise & sådan her:

SELECT * FROM UserTable WHERE Roles & 6 != 0
 

6 kan ombyttes til en hvilken som helst kombination af dit bitfelt, hvor du vil kontrollere, at enhver bruger har en eller flere af disse bits. Når jeg forsøger at validere dette, finder jeg det normalt nyttigt at skrive dette ud på lang hånd i binært. Din brugertabel ser sådan ud:

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

Din test (6) er denne

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

Hvis vi gennemgår hver person, der laver bitwaise, og mod testen får vi disse:

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)

Ovenstående skulle vise, at alle poster, hvor resultatet ikke er nul, har et eller flere af de anmodede flag.

Rediger:Her er testcasen, hvis du vil tjekke dette

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
 

eller

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

eller

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


  1. Sender tabellen som parameter

  2. MySQL :Vælg poster med betingelser, der gælder for flere rækker

  3. Udskrivningsresultat af mysql-forespørgsel fra variabel

  4. Understøtter PostgreSQL gennemsigtig komprimering af tabeller (fragmenter)?