web-dev-qa-db-fra.com

Pourquoi NOT IN avec un ensemble contenant NULL renvoie toujours FALSE / NULL?

J'ai eu une requête (pour Postgres et Informix) avec un NOT IN clause contenant une sous-requête qui, dans certains cas, a renvoyé des valeurs NULL, provoquant l'échec de cette clause (et de la requête entière).

Quelle est la meilleure façon de comprendre cela? Je pensais à NULL comme quelque chose sans valeur, et je ne m'attendais donc pas à ce que la requête échoue, mais ce n'est évidemment pas la bonne façon de penser à NULL.

21
newenglander

Logique booléenne - ou Logique à trois valeurs

  • IN est un raccourci pour une série de conditions OR
  • x NOT IN (1, 2, NULL) est identique à NOT (x = 1 OR x = 2 OR x = NULL)
  • ... est le même que x <> 1 AND x <> 2 AND x <> NULL
  • ... est le même que true AND true AND unknown **
  • ... = unknown **
  • ... qui est presque la même chose que false dans ce cas car il ne passera pas la condition WHERE **

Voilà pourquoi les gens utilisent EXISTS + NOT EXISTS plutôt que IN + NOT IN. Voir aussi L'utilisation de la logique NOT par rapport aux index pour plus

** Remarque: unknown est identique à false à la fin d'une expression dans une condition WHERE.
Pendant que l'expression est en cours d'évaluation, alors elle est inconnue
Voir le commentaire de @ kgrittn ci-dessous pour savoir pourquoi

29
gbn