Der SQL-Vergleich zwischen booleschen Werten kann zu unerwarteten Ergebnissen führen
P粉982009874
2023-08-18 16:25:41
<p>Warum liefern die meisten (alle?) SQL-Datenbanken die folgenden Ergebnisse: </p>
<pre class="brush:php;toolbar:false;">SELECT FALSE < FALSE / 0 Ok
SELECT TRUE < FALSE;
SELECT NOT(FALSE) <
SELECT NOT(TRUE) < ? </pre>
<p>Nur zur Kontrolle: </p>
<pre class="brush:php;toolbar:false;">SELECT NOT(TRUE) = FALSE -- TRUE / 1 Ok
SELECT NOT(FALSE) = TRUE -- TRUE / 1 Ok</pre>
<p>In Postgres kann ich auch Folgendes überprüfen: </p>
<pre class="brush:php;toolbar:false;">SELECT pg_typeof(TRUE), pg_typeof(NOT(FALSE));
-- boolean |. boolean</pre>
<p>Ich habe PostgreSQL, SQLite3 und MariaDB ausprobiert und sie liefern alle die gleichen unerwarteten Ergebnisse. </p><p>
<strong>Was habe ich übersehen? </strong></p>
我不确定
NOT(FALSE)
是如何评估的,但NOT
不是一个函数。如果你想要对一个布尔字面量取非,那么括号应该放在整个表达式的周围,即使用(NOT FALSE)
而不是NOT(FALSE)
。考虑以下示例: