在SQL WHERE子句中使用0x800

时间:2010-07-23 08:01:42

标签: sql tsql

我正在尝试使用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。

由于 丹尼

1 个答案:

答案 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