Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Porównanie dwóch masek bitowych w SQL w celu sprawdzenia, czy któryś z bitów pasuje

Odpowiedzią na twoje pytanie jest użycie Bitwise & tak:

SELECT * FROM UserTable WHERE Roles & 6 != 0

6 można wymienić na dowolną kombinację twojego pola bitowego, w którym chcesz sprawdzić, czy dowolny użytkownik ma jeden lub więcej z tych bitów. Kiedy próbuję to sprawdzić, zwykle uważam, że pomocne jest napisanie tego odręcznie w formacie binarnym. Twoja tabela użytkowników wygląda tak:

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

Twój test (6) jest taki

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

Jeśli przejdziemy przez każdą osobę wykonującą bitwaise I w porównaniu z testem otrzymamy następujące:

        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) 

Powyższe powinno wykazać, że wszelkie rekordy, w których wynik nie jest zerem, mają co najmniej jedną z żądanych flag.

Edycja:Oto przypadek testowy, jeśli chcesz to sprawdzić

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

lub

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

lub

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przekonwertować godzinę DATEPART, która jest czasem wojskowym dla północy (00) na wartość, której mogę użyć, gdy potrzebuję jej do obliczeń?

  2. Średnia i wielkość liter w SQL

  3. Co robi sp_reset_connection?

  4. Wykonywanie procedury składowanej przy użyciu Harmonogramu zadań systemu Windows

  5. Wewnętrzne elementy replikacji transakcyjnej serwera SQL — część 2