回答你的问题是使用位运算符 &
,像这样:
SELECT * FROM UserTable WHERE Roles & 6 != 0
数字6
可以与您的位域(bitfield)中的任何组合交换,其中您想要检查任何用户是否具有这些位(bit)中的一个或多个。在尝试验证此内容时,通常需要以二进制形式手写出来以便更好地理解。您的用户表如下:
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
如果我们对每个人进行按位与测试,则会得到以下结果:
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