Sql 正确<;MS Access中的错误?
我想对Sql 正确<;MS Access中的错误?,sql,database,ms-access,Sql,Database,Ms Access,我想对groupby的聚合函数中的布尔列执行或,从逻辑上讲,我为此选择了Max函数。但我在MS Access中发现TRUEFALSE的讨论变得毫无意义。毕竟,TRUE+1=FALSE有什么意义吗?不,不是这样,为什么任何人都应该关心TRUE>FALSE?他们不应该,这就是答案。@ Nealb SQL:2011基金会第8.2节比较谓词状态:“在布尔值的比较中,真大于假”,我不认为这是一个解释,因为例如在 C 代码>!0==1,而不是11111111。因此,访问中的不是,可以实现为,不按位不。我认为
groupby
的聚合函数中的布尔列执行或
,从逻辑上讲,我为此选择了Max
函数。但我在MS Access中发现TRUE
!MS Access似乎将TRUE
化名为-1
,而不是1
我在MySQL中也尝试了同样的方法,似乎效果很好:
mysql> select if(TRUE > FALSE, 1, 0);
+------------------------+
| if(TRUE > FALSE, 1, 0) |
+------------------------+
| 1 |
+------------------------+
为什么呢?究竟为什么Access在这里打破了SQL规范?来自:
False的二进制表示形式为0000000000000000。如果对它执行NOT操作(机器代码中),它将更改为1111111,但这是16位有符号整数-1的二进制表示形式
改变一个数字的符号是通过反转所有的位并加1来实现的。这被称为“二者的补充”
让我们改变1111111111的符号。第一倒置;我们得到:0000000000000000
然后加一个:000000000000000 1,这是1
这是1111是-1的二进制表示的证明
是在MSAccess中,true的值为-1
这可能与它的Visual Basic根有关(在VB-1中,确实可以帮助它的位运算符实现逻辑运算符的双重功能),但我不会感到惊讶,MSAccess打破了许多SQL规范。我认为没有任何SQL规范可以将布尔值映射为整数值。你说的是Microsoft Access,你为什么期望任何符合标准的行为;)在我看来,真/假只应被视为真值,因此不具有量级。这使得关于
TRUE>FALSE
的讨论变得毫无意义。毕竟,TRUE+1=FALSE
有什么意义吗?不,不是这样,为什么任何人都应该关心TRUE>FALSE
?他们不应该,这就是答案。@ Nealb SQL:2011基金会第8.2节比较谓词状态:“在布尔值的比较中,真大于假”,我不认为这是一个解释,因为例如在<代码> C <代码>代码>!0==1,而不是11111111
。因此,访问中的不是,可以实现为代码>,不按位不。我认为这只是一个失败的设计。不管怎样,他们为什么不使用无符号的类型呢?那么TRUE可以是11111111
,同时>FALSE
“无论如何,他们为什么不使用无符号类型呢?”?因为它是在VB运行时上构建的,并且VB运行时没有未签名的类型。“但是当VB运行时没有……”我不知道伙计,这是一个错误的决定,不止一次地咬了我的屁股,我可以告诉你:(谢谢你@BinaryWorrier