布尔值之间的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)
。考虑以下示例: