Por que a maioria (todos?) Os bancos de dados SQL fornecem:
SELECT FALSE < FALSE; -- FALSE / 0 Ok
SELECT TRUE < FALSE; -- FALSE / 0 Ok
SELECT NOT(FALSE) < FALSE; -- TRUE / 1 What?
SELECT NOT(TRUE) < FALSE; -- TRUE / 1 What??
E apenas verifique novamente:
SELECT NOT(TRUE) = FALSE; -- TRUE / 1 Ok
SELECT NOT(FALSE) = TRUE; -- TRUE / 1 Ok
No Postgres, também posso verificar:
SELECT pg_typeof(TRUE), pg_typeof(NOT(FALSE));
-- boolean | boolean
Eu tentei isso com PostgreSQL, SQLite3 e MariaDB, e todos concordam com o mesmo resultado inesperado.
o que estou perdendo?
Não sei exatamente como
NOT(FALSE)
está avaliando, masNOT
não é uma função. Se você não deseja um literal booleano, os parênteses devem estar em torno de toda a expressão, ou seja, use(NOT FALSE)
em vez deNOT(FALSE)
. Considerar:NOT
e<
são operadoras. Vamos dar uma olhada na precedência do operador:https://dev.mysql.com/doc/refman/8.0/en/operator-precedence.html
A partir daqui podemos ver que
<
precedeNOT
em prioridade, entãoé equivalente a
e como
FALSE
não é menor que ele mesmo, a expressão interna é 0, ou seja, éFALSE
e sua negação éTRUE
.Considerando que, se você aplicar a ordem do operador de sua preferência:
então você obterá o resultado esperado:
Minha resposta é sobre SQLite (mas suspeito que o mesmo se aplique a outros dbs).
Uma expressão como:
é avaliado como:
porque o operador
<
tem maior precedência sobre o operadorNOT
.Como
(FALSE) < FALSE
avalia comoFALSE
, o resultado da expressão éTRUE
.