【问题标题】:TRUE < FALSE in MS Access?MS Access 中的 TRUE < FALSE?
【发布时间】:2013-08-10 03:17:47
【问题描述】:

我想在group by 的聚合函数中的布尔列上执行OR,从逻辑上讲,我为此选择了Max 函数。但我在 MS Access 中发现了 TRUE &lt; FALSE!似乎 MS Access 将 TRUE 别名为 -1 而不是 1。

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

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

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

【问题讨论】:

  • 我认为没有任何关于将布尔值映射到整数值的 SQL 规范。
  • 您在谈论 Microsoft Access,您为什么期望任何符合标准的行为 ;)
  • 在我看来,TRUE/FALSE 应该只被视为真值,因此没有大小。这使得讨论TRUE &gt; FALSE 是否毫无意义。毕竟TRUE + 1 = FALSE 有意义吗?不,不是这样,为什么有人要担心TRUE &gt; FALSE?他们不应该,这就是答案。
  • @NealB SQL:2011 Foundation section 8.2 比较谓词指出:“在布尔值的比较中,True 大于 False”

标签: sql database ms-access


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    来自This answer:

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

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

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

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

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

    【讨论】:

    • 好吧,我不认为这是一个解释,因为例如在C,!0 == 1,而不是11111111。因此,Access 中的NOT 可以实现为!,而不是按位NOT。我认为这只是一个损坏的设计。
    • 那么,他们为什么不使用unsigned 类型呢?那么 TRUE 可能是 11111111 和同时 &gt; FALSE。
    • “无论如何,他们为什么不使用无符号类型”?因为它建立在 VB 运行时之上,而 VB 运行时没有无符号类型。 “但是 VB Runtime 什么时候没有……”我不知道,伙计,这是一个糟糕的决定,我不止一次可以告诉你:(
    • 谢谢@BinaryWorrier
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多