Eu tinha uma consulta (para Postgres e Informix) com uma NOT IN
cláusula contendo uma subconsulta que em alguns casos retornava NULL
valores, fazendo com que aquela cláusula (e toda a consulta) não retornasse nada.
Qual é a melhor maneira de entender isso? Eu pensei NULL
em algo sem valor e, portanto, não esperava que a consulta falhasse, mas obviamente essa não é a maneira correta de pensar em NULL
.
Lógica booleana - ou lógica de três valores
x NOT IN (1, 2, NULL)
é o mesmo queNOT (x = 1 OR x = 2 OR x = NULL)
x <> 1 AND x <> 2 AND x <> NULL
true AND true AND unknown
**unknown
**false
neste caso, pois não passará daWHERE
condição **Agora, é por isso que as pessoas usam
EXISTS
+NOT EXISTS
em vez deIN
+NOT IN
. Veja também O uso da lógica NOT em relação a índices para mais** Nota:
unknown
é o mesmo quefalse
no final de uma expressão em umaWHERE
condição.Enquanto a expressão está sendo avaliada, ela é desconhecida
Veja o comentário de @kgrittn abaixo para saber o motivo