2013-03-08 96 views
1

什么了 “&” 这里的意思:这个sql where子句中的“&”是什么意思?

select pt.TrTp, sum(pt.TrTp) 
from ProdTr pt 
where TransSt & 16 <> 16 // this is the row that i don´t understand.. 
group by pt.TrTp 
+1

这是一个按位与。更多信息:http://msdn.microsoft.com/en-us/library/ms174965.aspx – 2013-03-08 08:48:44

回答

5

这就是所谓的位掩码。它用于数字中的各个位具有不同含义的情况,而不是仅仅表示数字本身的数字(例如,如果将年龄保存到数据库)。

当你想象任何二进制形式的数字,并且想要测试数字中是否有特定的位被设置时,你可以用二进制AND运算符来测试它的数字和想要测试的位,如下所示:

if (number & 16 == 16) 

在二进制,这意味着以下(假设你的号码是25):

if (00011001 & 00010000 == 00010000) 

在这里你可以看到,在5位数字(从下往上数)是为1,因此得到的数字在那个位上有1。由于没有其他1,当两个数字在这个位置上都有1时,结果数字是16。

我想补充一点:将不同的含义编码到一个数据库字段通常是不好的做法。索引很难索引和检索,并且根据您的DBMS甚至可能完全没有索引。

+0

zomg。关于掩码的真棒解释。 – 2013-03-08 08:58:22

+0

好的,但是不能用这个where子句重写成任何“更简单”的形式吗? – 2013-03-08 09:01:28

+0

不适用于给定的数据库结构。有人决定他想将信息编码成数字中的单个位。除非将单个数字信息划分为列,即重构数据库,否则无法绕过这一点。我强烈建议这一点,因为现代DMBS在优化方面比现在大多数人好得多。 – 0xCAFEBABE 2013-03-08 09:04:52

0

这是一个按位与。

&按位运算符在两个表达式之间执行按位逻辑“与”,将两个表达式的每个对应位都取出。当且仅当输入表达式中的两个位(用于解析当前位)具有值1时,结果中的位才被设置为1;否则,在结果的位被设置为0。

http://msdn.microsoft.com/en-us/library/ms174965.aspx

在这种情况下,它与一个标志,其中多个值存储在一个场,然后按位与操作用于使用请检查特定状态 - 或者在此情况下检查特定状态 - 检查该字段是否不包含指定状态。

0

这是按位AND。它只是检查值4中是否没有设置。

我想改写这个表达

0

这是一个按位AND运算符。

按位操作在其各个位的级别上对一个或多个位模式或二进制数字进行操作。这是一个由处理器直接支持的快速原始动作,用于处理比较和计算的值。在简单的低成本处理器中,典型情况下,按位操作比分割速度快得多,比乘法快几倍,有时比添加快得多。虽然现代处理器通常由于其较长的指令流水线和其他架构设计选择而执行与逐位操作一样快的加法和乘法,但由于资源的使用减少,按位操作通常使用较少的功率/性能。

http://en.wikipedia.org/wiki/Bitwise_operation