sql >> Base de Datos >  >> RDS >> Sqlserver

Comparando dos máscaras de bits en SQL para ver si alguno de los bits coincide

La respuesta a su pregunta es usar Bitwise & así:

SELECT * FROM UserTable WHERE Roles & 6 != 0

El 6 se puede intercambiar por cualquier combinación de su campo de bits donde desee verificar que cualquier usuario tenga uno o más de esos bits. Cuando trato de validar esto, generalmente encuentro útil escribir esto a mano en binario. Su tabla de usuarios se ve así:

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

Tu prueba (6) es esta

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

Si revisamos a cada persona haciendo bitwaises y contra la prueba obtenemos esto:

        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) 

Lo anterior debería demostrar que cualquier registro cuyo resultado no sea cero tiene uno o más de los indicadores solicitados.

Editar:aquí está el caso de prueba si desea verificar esto

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

o

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

o

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