Der SQL-Vergleich zwischen booleschen Werten kann zu unerwarteten Ergebnissen führen
P粉982009874
P粉982009874 2023-08-18 16:25:41
0
1
558
<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>
P粉982009874
P粉982009874

Antworte allen(1)
P粉513316221

我不确定 NOT(FALSE) 是如何评估的,但 NOT 不是一个函数。如果你想要对一个布尔字面量取非,那么括号应该放在整个表达式的周围,即使用 (NOT FALSE) 而不是 NOT(FALSE)。考虑以下示例:

SELECT (NOT FALSE) < FALSE; -- 0,与 TRUE < FALSE 相同
SELECT (NOT TRUE) < FALSE; -- 0,与 FALSE < FALSE 相同
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage