我想在OR
的聚合函数中对布尔列执行group by
,从逻辑上讲,我为此选择了Max
函数。但我在MS Access中发现了TRUE < FALSE
!似乎MS Access将TRUE
别名变为-1
而不是1
。
我在MySQL中尝试过相同的工作,似乎工作正常:
mysql> select if(TRUE > FALSE, 1, 0);
+------------------------+
| if(TRUE > FALSE, 1, 0) |
+------------------------+
| 1 |
+------------------------+
为什么?为什么Access在这里打破了SQL规范?
答案 0 :(得分:2)
来自This answer:
False的二进制表示为0000000000000000.如果对它执行NOT操作(在机器代码中),它将更改为1111111111111111,但这是16位有符号整数-1的二进制表示。
通过反转所有位并加1来改变数字的符号。这称为“二进制补码”。
让我们改变1111111111111111的标志。我们得到:0000000000000000
然后添加一个:0000000000000001,这是1。
这证明1111111111111111是-1的二进制表示。
答案 1 :(得分:1)
在MSAccess中是,值为true。
它可能与它的Visual Basic根有关(在VB -1中是真的,以帮助它的BITWISE运算符作为逻辑运算符执行双重任务),但我不会感到惊讶,MSAccess打破了许多许多 SQL规范。