我正在尝试使用SQL Profiler解密一些从专有应用程序运行的SQL语句。
其中一个陈述是:
SELECT ID, Groups, Name, Gallery FROM DashboardReports WHERE (Groups & 0x800) <> 0 AND Root = 1 ORDER BY Name
任何人都可以解释WHERE子句的工作原理吗?我之前从未见过像这样的WHERE子句,“Groups”列包含整数值,如2048,2176,150 AND 414。
由于 丹尼
答案 0 :(得分:2)
这是一个按位操作 - http://en.wikipedia.org/wiki/Bitwise_operation
十六进制的0x800是2048,因此它与写入(Groups&amp; 2048)&lt;&gt;相同0
此where子句告诉查询过滤掉关闭“组”列中第12位的所有记录。
2048表示第12位已打开(当您将数字视为二进制值时更有意义。)
0000 1000 0000 0000 = 2048
这是在单个列中存储多个开/关值的便捷方式。 150是位(128和32)的组合,它们都将评估为真:
(Groups & 128) <> 0
(Groups & 32) <> 0
以下是您的位及其值的快速列表:
1 1
2 2
3 4
4 8
5 16
6 32
7 64
8 128
9 256
10 512
11 1024
12 2048
本文可能有所帮助 - http://www.codeproject.com/KB/cpp/bitbashing.aspx