La comparaison SQL entre les valeurs booléennes peut conduire à des résultats inattendus
P粉982009874
2023-08-18 16:25:41
<p>Pourquoi la plupart (toutes ?) des bases de données SQL donnent-elles les résultats suivants : </p>
<pre class="brush:php;toolbar:false;">SELECT FALSE <
SELECT VRAI < -- FAUX / 0 Ok
SELECT NOT(FALSE) < FALSE; -- VRAI / 1 Quoi ?
SELECT NOT(TRUE) < FALSE; -- VRAI / 1 Quoi ? ? ≪/pré>
<p>Juste pour vérifier : </p>
<pre class="brush:php;toolbar:false;">SELECT NOT(TRUE) = FALSE -- TRUE / 1 Ok
SELECT NOT(FALSE) = VRAI ; -- VRAI / 1 Ok</pre>
<p>Dans Postgres, je peux également vérifier : </p>
<pre class="brush:php;toolbar:false;">SELECT pg_typeof(TRUE), pg_typeof(NOT(FALSE));
-- booléen | booléen</pre>
<p>J'ai essayé PostgreSQL, SQLite3 et MariaDB et ils donnent tous les mêmes résultats inattendus. </p><p>
<strong>Qu'est-ce qui me manque ? </strong></p>
Je ne suis pas sûr
NOT(FALSE)
是如何评估的,但NOT
不是一个函数。如果你想要对一个布尔字面量取非,那么括号应该放在整个表达式的周围,即使用(NOT FALSE)
而不是NOT(FALSE)
. Prenons l'exemple suivant :