首页  >  问答  >  正文

布尔值之间的SQL比较可能导致意外结果

<p>为什么大多数(全部?)SQL数据库会给出以下结果:</p> <pre class="brush:php;toolbar:false;">SELECT FALSE < FALSE; -- FALSE / 0 Ok SELECT TRUE < FALSE; -- FALSE / 0 Ok SELECT NOT(FALSE) < FALSE; -- TRUE / 1 什么? SELECT NOT(TRUE) < FALSE; -- TRUE / 1 什么??</pre> <p>只是再次确认一下:</p> <pre class="brush:php;toolbar:false;">SELECT NOT(TRUE) = FALSE; -- TRUE / 1 Ok SELECT NOT(FALSE) = TRUE; -- TRUE / 1 Ok</pre> <p>在Postgres中,我也可以检查:</p> <pre class="brush:php;toolbar:false;">SELECT pg_typeof(TRUE), pg_typeof(NOT(FALSE)); -- boolean | boolean</pre> <p>我已经尝试过PostgreSQL、SQLite3和MariaDB,它们都得出了相同的意外结果。</p><p> <strong>我漏掉了什么?</strong></p>
P粉982009874P粉982009874428 天前532

全部回复(1)我来回复

  • P粉513316221

    P粉5133162212023-08-19 09:07:28

    我不确定 NOT(FALSE) 是如何评估的,但 NOT 不是一个函数。如果你想要对一个布尔字面量取非,那么括号应该放在整个表达式的周围,即使用 (NOT FALSE) 而不是 NOT(FALSE)。考虑以下示例:

    SELECT (NOT FALSE) < FALSE; -- 0,与 TRUE < FALSE 相同
    SELECT (NOT TRUE) < FALSE; -- 0,与 FALSE < FALSE 相同
    

    回复
    0
  • 取消回复