34

对不起,这个非常基本的问题。&操作符在这条 SQL 中做了什么

WHERE (sc.Attributes & 1) = 0 

sc是包含列的表的别名attributes

我试图理解报告中的一些 SQL,并且该行使其返回 0 个条目。如果我将其注释掉,它会起作用。我的 SQL 知识有限,我不确定& 1它在做什么。

4

4 回答 4

49

& 是按位逻辑和运算符- 它对 2 个整数值执行操作。

WHERE (sc.Attributes & 1) = 0 

上面的代码检查 sc.Attributes 是否为偶数。这与说第一位未设置相同。

由于列的名称:“属性”,那么“1”值可能只是一些具有某些外部含义的标志。

对于存储在属性数字中的每个标志,通常使用 1 个二进制数字。因此,要测试第一位使用 sc.Attributes&1,测试第二位使用 sc.Attributes&2,测试第三位使用 sc.Attributes&4,测试第四位使用 sc.Attributes&8,...

= 0 部分正在测试是否未设置第一位。

一些二进制示例:(== 显示操作结果)

//Check if the first bit is set, same as sc.Attributes&1
11111111 & 00000001 == 1
11111110 & 00000001 == 0
00000001 & 00000001 == 1


//Check if the third bit is set, same as sc.Attributes&4
11111111 & 00000100 == 1
11111011 & 00000100 == 0
00000100 & 00000100 == 1
于 2009-03-21T23:44:13.587 回答
5

它是按位逻辑 AND 运算符

于 2009-03-21T23:41:39.600 回答
5

这是一个位和

于 2009-03-21T23:42:07.803 回答
1

看到您将其标记为 sql server,我想我会从不同的角度添加一些东西,因为这周也遇到了其中一个。

如果在谓词中使用这些可能会损害查询的性能。很容易制造自己的例子。这是我查询的片段

WHERE
advertiserid = @advertiserid
AND (is_deleted & @dirty > 0)

WHERE
advertiserid = @advertiserid
AND (is_deleted > 0 AND @dirty > 0)

通过简单地用适当的值定义每一列,这允许优化器删除书签查找,并且性能统计显示 X10 性能提升。

于 2012-06-19T20:48:59.360 回答