布林值之間的SQL比較可能導致意外結果
P粉982009874
2023-08-18 16:25:41
<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>
我不確定
NOT(FALSE)
是如何評估的,但NOT
不是一個函數。如果你想要對一個布林字面量取非,那麼括號應該放在整個表達式的周圍,即使用(NOT FALSE)
而不是NOT(FALSE)
。考慮以下範例: