比较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