sql >> Databasteknik >  >> RDS >> Sqlserver

Jämför två bitmasker i SQL för att se om någon av bitarna matchar

Svaret på din fråga är att använda Bitwise & så här:

SELECT * FROM UserTable WHERE Roles & 6 != 0

6 kan bytas ut mot valfri kombination av ditt bitfält där du vill kontrollera att någon användare har en eller flera av dessa bitar. När jag försöker validera detta tycker jag vanligtvis att det är till hjälp att skriva ut det här i binärt format. Din användartabell ser ut så här:

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

Ditt test (6) är detta

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

Om vi ​​går igenom varje person som gör bitwaise Och mot testet får vi dessa:

        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) 

Ovanstående bör visa att alla poster där resultatet inte är noll har en eller flera av de begärda flaggorna.

Edit:Här är testfallet om du vill kontrollera detta

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. SimpleSAMLPHP omdirigeringsslinga

  2. Hur kan jag ställa in en storleksgräns för en int-datatyp i PostgreSQL 9.5

  3. Hur fixar jag, "PHP"-fabrikat, i Mac OS X (10.9.4)?

  4. Fel vid försök att köra Create Extension postgis