Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Comparando duas bitmasks no SQL para ver se algum dos bits corresponde


A resposta para sua pergunta é usar o Bitwise & assim:
SELECT * FROM UserTable WHERE Roles & 6 != 0

O 6 pode ser trocado por qualquer combinação do seu campo de bits onde você deseja verificar se algum usuário possui um ou mais desses bits. Ao tentar validar isso, geralmente acho útil escrever isso à mão em binário. Sua tabela de usuário se parece com isso:
        1   2   4
------------------
Dave    0   1   1
Charlie 0   1   0
Susan   0   0   1   
Nick    1   0   0

Seu teste (6) é este
        1   2   4
------------------
Test    0   1   1

Se passarmos por cada pessoa fazendo o bitwaise E contra o teste, obtemos estes:
        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) 

O acima deve demonstrar que quaisquer registros em que o resultado não seja zero possuem um ou mais dos sinalizadores solicitados.

Edit:Aqui está o caso de teste, caso você queira verificar isso
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

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

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