我在WHERE
子句中有以下条件:
AND flag&(2+4+1048576+16777216)=0
以上是什么意思?标志字段数据类型为Integer
。
答案 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.