比较SQL中的两个位掩码以查看是否有任何位匹配

时间:2020-03-06 14:49:28  来源:igfitidea点击:

有没有一种方法可以比较Transact-SQL中的两个位掩码以查看是否有任何位匹配?对于用户所属的所有角色,我都有一个带位掩码的User表,我想在提供的位掩码中选择具有任何角色的所有用户。因此,使用下面的数据,角色位掩码为6(设计师+程序员)应选择Dave,Charlie和Susan,但不要选择Nick。

User Table
----------
ID  Username  Roles
1   Dave      6
2   Charlie   2
3   Susan     4
4   Nick      1

Roles Table
-----------
ID  Role
1   Admin
2   Programmer
4   Designer

有任何想法吗?谢谢。

解决方案

使用Transact-SQL按位AND运算符"&",并将结果与​​零进行比较。更好的是,不是将角色编码为整数列的位,而是使用布尔列,每个角色一个。然后,查询将只对设计人员和程序员友好。如果我们希望角色在应用程序的整个生命周期中发生很大变化,请使用多对多表来映射用户及其角色之间的关联。这两种选择都比依赖于按位与运算符的存在更具可移植性。

查找所有程序员使用:

SELECT * FROM UserTable WHERE Roles & 2 = 2

SELECT * FROM table WHERE mask1&mask2> 0

例子:

DECLARE @Mask int
SET @Mask = 6

DECLARE @Users TABLE
(
ID int,
Username varchar(50),
Roles int
)

INSERT INTO @Users (ID, Username, Roles) 
SELECT 1, 'Dave', 6
UNION
SELECT 2, 'Charlie', 2
UNION
SELECT 3, 'Susan', 4
UNION
SELECT 4, 'Nick', 1

SELECT * FROM @Users WHERE Roles & @Mask > 0