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
.
Logique booléenne - ou Logique à trois valeurs
x NOT IN (1, 2, NULL)
est identique à NOT (x = 1 OR x = 2 OR x = NULL)
x <> 1 AND x <> 2 AND x <> NULL
true AND true AND unknown
**unknown
**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