搜尋

首頁  >  問答  >  主體

布林值之間的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粉982009874548 天前610

全部回覆(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
  • 取消回覆