SQL Server WHERE子句中的&符号(&)运算符

时间:2009-03-21 23:39:48

标签: sql-server tsql bitwise-operators

抱歉这个非常基本的问题。 &运算符在此SQL

中的作用
WHERE (sc.Attributes & 1) = 0 

sc是包含列attributes的表的别名。

我正在尝试理解报告中的一些SQL,并且该行使其返回0个条目。如果我发表评论它是有效的。我的SQL知识有限,我不确定& 1正在做什么。

4 个答案:

答案 0 :(得分:46)

& is the bitwise logical and operator - 它对2个整数值执行操作。

WHERE (sc.Attributes & 1) = 0 

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

由于列的名称虽然:“Attributes”,但“1”值可能只是一些具有一些外部含义的标志。

对于存储在数字中的每个标志,通常使用1个二进制数字作为属性。因此,为了测试你使用sc.Attributes& 1的第一个位,测试你使用sc.Attributes& 2的第二个,测试你使用sc.Attributes& 4的第三个,来测试你使用sc的第四个。属性& 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

答案 1 :(得分:3)

答案 2 :(得分:3)

这是bitwise and

答案 3 :(得分:1)

当你把它标记为sql server时,我想我会从不同的角度添加一些内容,因为本周也会遇到其中一个。

如果在谓词中使用,这些可能会损害查询的性能。很容易制作自己的例子。以下是我的查询摘录

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

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

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