比较两位掩码在SQL看到,如果任何位匹配
-
02-07-2019 - |
题
是否有一个方式比较两位掩码在Transact-SQL看到,如果任何一位匹配?我已经有了一个用户表与位于所有角色的用户所属的,我喜欢选择的所有用户都有 任何 角色中所提供的位.因此,使用下面的数据,一个职位的6(设计师+程序员)应该选择戴夫,查理和苏珊,但不是尼克
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
任何想法?谢谢。
解决方案
回答你的问题是使用按位 &
是这样的:
SELECT * FROM UserTable WHERE Roles & 6 != 0
的 6
可兑换的任何组合你的bitfield你想要检查任何用户都有一个或更多的那些位。当尝试,以验证这个我经常发现它有助于编写该出普通的二进制的你的用户表看起来像这样:
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
其他提示
使用的Transact-SQL 按位和操作者 "&"和比较的结果为零。甚至更好,而不是编码的职位的一整数列中,使用布尔列,每一个的作用。然后您的查询只会是设计和编程友好。如果您期望的角色改变了很多生命周期的应用程序,然后利用一个多对多表到地图之间的关联的用户及他们的角色。这两个替代方案被更多的便携式不依赖所存在的位和运营商。
SELECT * FROM UserTable WHERE Roles & 6 > 0
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
找到所有程序员使用:
SELECT * FROM UserTable WHERE Roles & 2 = 2
不隶属于 StackOverflow