Eu tive 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 a cláusula (e toda a consulta) falhasse ao retornar qualquer coisa.
Qual é a melhor maneira de entender isso? Eu pensei que era NULL
algo sem valor e, portanto, não esperava que a consulta falhasse, mas obviamente essa não é a maneira correta de pensar NULL
.
fonte
x <> NULL
resolvendoFALSE
, vocêNOT (x <> NULL)
deve avaliarTRUE
, e não. Ambos avaliam aUNKNOWN
. O truque é que uma linha é selecionada apenas se aWHERE
cláusula (se presente) for avaliada comoTRUE
- uma linha será omitida se a cláusula for avaliada comoFALSE
ouUNKNOWN
. Esse comportamento (em geral, e para oNOT IN
predicado em particular) é obrigatório pelo padrão SQL.NULL NOT IN (some_subquery)
não deve retornar a linha externa, exceto sesome_subquery
não retornar nenhuma linha. É por isso que o plano de execução, quando ambas as colunas são capazes de nulo, pode ser consideravelmente mais caro. Exemplo do SQL Server