gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:06:11 25 4
gpt4 key购买 nike

有没有办法比较 Transact-SQL 中的两个位掩码来查看是否有任何位匹配?我有一个用户表,其中包含用户所属的所有角色的位掩码,并且我想选择在提供的位掩码中具有任何角色的所有用户。因此,使用下面的数据,角色位掩码为 6(设计师+程序员)应选择 Dave、Charlie 和 Susan,但不选择 Nick。

User Table----------ID  Username  Roles1   Dave      62   Charlie   23   Susan     44   Nick      1Roles Table-----------ID  Role1   Admin2   Programmer4   Designer

有什么想法吗?谢谢。

最佳答案

您问题的答案是使用按位&,如下所示:

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 - 比较 SQL 中的两个位掩码以查看是否有任何位匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/143712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com