如何查看子值是否在掩码值中

时间:2019-01-18 21:14:59

标签: sql-server tsql bitwise-operators base bitmask

我遇到了一些将多个复选框值存储到数据库中1个值中的代码。

这是通过为每个值分配一个基数为2 ^ n的值,然后将所有选定值相加并存储该结果来实现的。

我想知道如何查询数据库中在数据库中存储的值中具有特定值的记录。

示例

Checkbox 1 = 2
Checkbox 2 = 4
Checkbox 3 = 8
Checkbox 4 = 16

可以说选择了复选框1和3。我们将在数据库中存储10。

如何查询在数据库(10)中存储的结果值中选中复选框1(值2)的记录?

这是sql server。

2 个答案:

答案 0 :(得分:2)

您可以按位使用AND

SELECT *
FROM tab
WHERE answer & 10 = 10

@@OPTIONS上使用了类似的方法:

  

@@ OPTIONS 函数返回选项的位图,并转换为以10为基数(十进制)的整数。

     

要解码 @@ OPTIONS 值,请将 @@ OPTIONS 返回的整数转换为二进制,然后在“配置用户选项”的表上查找值服务器配置选项。例如,如果SELECT @@ OPTIONS;返回值5496,请使用Windows程序员计算器(calc.exe)将十进制5496转换为二进制。结果为1010101111000。最右边的字符(二进制1、2和4)为0,指示表中的前三项已关闭。

检查ANSI_NULLS

  

要查看此设置的当前设置,请运行以下查询:

DECLARE @ANSI_NULLS VARCHAR(3) = 'OFF';  
IF ( (32 & @@OPTIONS) = 32 ) SET @ANSI_NULLS = 'ON';  
SELECT @ANSI_NULLS AS ANSI_NULLS; 

答案 1 :(得分:1)

您可以使用&

的按位运算

以12为例。 12的按位等效为1100。如果要获取是否已选中复选框3,则需要与8(等效1000)进行比较

1100
1000
-----
1000 => 8

因此您的最终查询将是

SELECT * from Table1 WHERE answer & 8 = 8