sql >> Databáze >  >> RDS >> Sqlserver

Porovnání dvou bitových masek v SQL, abyste zjistili, zda se některý z bitů shoduje

Odpověď na vaši otázku je použít Bitwise & takhle:

SELECT * FROM UserTable WHERE Roles & 6 != 0

6 lze vyměnit za libovolnou kombinaci vašeho bitového pole, kde chcete zkontrolovat, že některý uživatel má jeden nebo více těchto bitů. Když se to snažím ověřit, obvykle mi přijde užitečné napsat to dlouhým písmem v binární podobě. Vaše tabulka uživatelů vypadá takto:

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

Váš test (6) je tento

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

Pokud projdeme každou osobu, která provádí bitový signál, a proti testu dostaneme toto:

        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) 

Výše uvedené by mělo demonstrovat, že všechny záznamy, jejichž výsledek není nula, mají jeden nebo více požadovaných příznaků.

Edit:Zde je testovací případ, kdy byste to chtěli zkontrolovat

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

nebo

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

nebo

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


  1. syntaxe mysql na nerovných mnoha hodnotách

  2. Nelze se připojit k databázi MySql na vzdáleném linuxovém serveru z nástroje GUI systému Windows

  3. Funkce Lead and Lag v Mysql

  4. věštecká procedura k vypsání názvů tabulek a odpovídajícího počtu