的回答你的问题是使用像这样的Bitwise &
:
SELECT * FROM UserTable WHERE Roles & 6 != 0
6
可以交换为您的位域的任何组合,您要检查任何用户是否有一个或多个这些位。当试图验证这一点时,我通常会发现用二进制编写这个代码很有用。你的用户表看起来像这样:
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
&运算符适用于位掩码与一个角色相比较,但不用于比较位掩码和其他位掩码。我想我必须使用动态sql并将每个角色放入where子句中。 – Nick 2008-09-27 15:03:37
@尼克 - 错 - 请参阅我的回答。 – Jamiec 2012-02-13 15:56:04