这个条件在where子句中意味着什么

时间:2014-12-18 15:53:10

标签: sql sql-server-2008 tsql

我在WHERE子句中有以下条件:

AND flag&(2+4+1048576+16777216)=0

以上是什么意思?标志字段数据类型为Integer

2 个答案:

答案 0 :(得分:2)

这个where子句利用二进制算法, 这由按位('&')和运算符表示。

标志的十进制值266400以二进制表示为0b1000001000010100000。

一起添加的整数文字的小数值为17825798。 二进制表示为0b1000100000000000000000110。

通过将这些二进制值一起添加,可以得到:

      0b1000001000010100000  <- flags binary value
0b1000100000000000000000110  <- literals binary value
===========================
0b0000000000000000000000000  <- '&' operator results 

由于没有列将两个位都设置为1,因此整体结果为0。

所以where子句成功,因为flag&amp;(2 + 4 + 1048576_16777216)= 0或0 = 0,这是真的。

答案 1 :(得分:0)

此代码正在查找字段标志中的某些位未设置为1。

每个值都有二进制表示:

2        = 0000000000000000000000010
4        = 0000000000000000000000100
1048576  = 0000100000000000000000000
16777216 = 1000000000000000000000000
------------------------------------ +
17825798 = 1000100000000000000000110

我这里只有ORACLE,所以请让我使用ORACLE语法来解释它(你可以用&amp;运算符代替):

如果您检查带有任何这些值的标记,您将始终收到非零响应。

示例:

SELECT BITAND( 2, 17825798 ) FROM DUAL;

return 2

SELECT BITAND( 2+4, 17825798 ) FROM DUAL;

return 6

如果你检查另一个随机位,比如......

SELECT BITAND( 2+1, 17825798 ) FROM DUAL;

return 2

SELECT BITAND( 2+16, 17825798 ) FROM DUAL;

return 2

因为您只检查字段标志中的某些位。

因此,如果按位运算符返回0,则17825798掩码中的任何位都设置为1.