gpt4 book ai didi

sql - 如何处理 SQL 记录的大量标志

转载 作者:行者123 更新时间:2023-12-04 08:58:13 25 4
gpt4 key购买 nike

我需要有关如何处理 SQL2k8 表中相对较大的一组标志的建议。

两个问题,请耐心等待:)

假设我想为一个记录存储 20 个标志。

例如:

可以读取 = 0x1
可写 = 0x2
可以修改 = 0x4
...
依此类推到最终标志 2^20

现在,如果我设置一条记录的以下组合:Permissions = CanRead |可以写

我可以通过执行 WHERE (Permissions & CanRead) = CanRead 轻松检查该记录是否需要许可

那个有效。

但是,我还想检索所有可以写入或修改的记录。

如果我发出 WHERE (Permissions & ( CanWrite | CanModify )) = (CanWrite | CanModify) 我显然不会得到权限设置为 CanRead | 的记录可以写

换句话说,我如何找到与我要发送到程序的掩码中的任何标志相匹配的记录?

第二个问题,SQL 2008 中的性能如何?创建 20 位字段实际上会更好吗?

谢谢你的帮助

最佳答案

我假设您的 Permissions 列是 Int。如果是,我鼓励您使用我在下面提供的示例代码。这应该让您清楚地了解该功能的工作原理。

Declare @Temp Table(Permission Int, PermissionType VarChar(20))

Declare @CanRead Int
Declare @CanWrite Int
Declare @CanModify Int

Select @CanRead = 1, @CanWrite = 2, @CanModify = 4

Insert Into @Temp Values(@CanRead | @CanWrite, 'Read,write')
Insert Into @Temp Values(@CanRead, 'Read')
Insert Into @Temp Values(@CanWrite, 'Write')
Insert Into @Temp Values(@CanModify | @CanWrite, 'Modify, write')
Insert Into @Temp Values(@CanModify, 'Modify')

Select *
From @Temp
Where Permission & (@CanRead | @CanWrite) > 0

Select *
From @Temp
Where Permission & (@CanRead | @CanModify) > 0

当您使用逻辑和时,您将根据您的条件得到一个带有 1 的适当设置的数字。如果没有匹配,则结果为 0。如果有 1 个或多个条件匹配,则结果将大于 0。

让我给你看一个例子。

假设 CanRead = 1、CanWrite = 2 和 CanModify = 4。有效的组合是:
Modify Write Read Permissions
------ ----- ---- -----------
0 0 0 Nothing
0 0 1 Read
0 1 0 Write
0 1 1 Read, Write
1 0 0 Modify
1 0 1 Modify, Read
1 1 0 Modify, Write
1 1 1 Modify, Write, Read

现在,假设您要测试 Read 或 Modify。从您的应用程序中,您将传入 (CanRead | CanModify)。这将是 101(二进制)。

首先,让我们针对 ONLY 已读取的表中的一行进行测试。
   001 (Row from table)
& 101 (Permissions to test)
------
001 (result is greater than 0)

现在,让我们针对只有 Write 的行进行测试。
   010 (Row from table)
& 101 (Permission to test)
------
000 (result = 0)

现在针对具有所有 3 个权限的行进行测试。
   111 (Row from table)
& 101 (Permission to test)
------
101 (result is greater than 0)

我希望您能看到,如果 AND 运算的结果是值 = 0,则测试权限都不适用于该行。如果该值大于 0,则至少存在一行。

关于sql - 如何处理 SQL 记录的大量标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/158519/

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