Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Сравняване на две битови маски в SQL, за да се види дали някой от битовете съвпада

Отговорът на вашия въпрос е да използвате побитовия & като това:

SELECT * FROM UserTable WHERE Roles & 6 != 0

6 може да се обменя за всяка комбинация от вашето битово поле, където искате да проверите дали всеки потребител има един или повече от тези битове. Когато се опитвам да потвърдя това, обикновено намирам за полезно да напиша това на ръка в двоичен код. Вашата потребителска таблица изглежда така:

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

Вашият тест (6) е това

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

Ако преминем през всеки човек, който прави bitwaise и срещу теста, получаваме следното:

        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) 

Горното трябва да демонстрира, че всички записи, където резултатът не е нула, имат един или повече от заявените флагове.

Редактиране:Ето тестовия случай, ако искате да проверите това

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

или

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

или

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. Как да създам списък, разделен със запетая, използвайки SQL заявка?

  2. SQL - изберете отделни записи в едно поле с най-високи записи от друго поле

  3. SQL заявка за 7-дневна подвижна средна стойност в SQL Server

  4. Масово вмъкване на полета с фиксирана ширина

  5. Каква е добра идея за запазване на данни от чат в база данни?