2

我想OR在聚合函数的布尔列上做group by,从逻辑上讲,我Max为此选择了函数。TRUE < FALSE但我在 MS Access 中发现了这一点!似乎 MS Access 是别名TRUE-1不是1.

我在 MySQL 中尝试了同样的方法,似乎工作正常:

mysql> select if(TRUE > FALSE, 1, 0);
+------------------------+
| if(TRUE > FALSE, 1, 0) |
+------------------------+
|                      1 |
+------------------------+

这是为什么?为什么 Access 在这里打破了 SQL 规范?

4

2 回答 2

2

这个答案

False 的二进制表示是 0000000000000000。如果对它执行 NOT 操作(在机器代码中),它将变为 1111111111111111,但这是 16 位有符号整数 -1 的二进制表示。

通过反转所有位并加 1 来更改数字的符号。这称为“二进制补码”。

让我们更改 1111111111111111 的符号。首先反转;我们得到:0000000000000000

然后加一个:0000000000000001,这是1。

这证明了 1111111111111111 是 -1 的二进制表示。

于 2013-08-08T12:06:26.347 回答
1

在 MSAccess 中是,true 的值为 -1。

它可能与它的 Visual Basic 根源有关(在 VB 中,-1 确实有助于它的 BITWISE 运算符作为逻辑运算符执行双重职责),但我不会感到如此惊讶,MSAccess 打破了许多SQL 规范。

于 2013-08-08T12:07:40.123 回答