Le IS DISTINCT FROM le prédicat a été introduit en tant que fonctionnalité T151 de SQL:1999, et sa négation lisible, IS NOT DISTINCT FROM , a été ajoutée en tant que fonctionnalité T152 de SQL:2003. Le but de ces prédicats est de garantir que le résultat de la comparaison de deux valeurs est soit True ou Faux , jamais Inconnu .
Ces prédicats fonctionnent avec n'importe quel type comparable (y compris les lignes, les tableaux et les multi-ensembles), ce qui rend plutôt compliqué leur émulation exacte. Cependant, SQL Server ne prend pas en charge la plupart de ces types, nous pouvons donc aller assez loin en vérifiant les arguments/opérandes nuls :
-
a IS DISTINCT FROM bpeut être réécrit comme :((a <> b OR a IS NULL OR b IS NULL) AND NOT (a IS NULL AND b IS NULL)) -
a IS NOT DISTINCT FROM bpeut être réécrit comme :(NOT (a <> b OR a IS NULL OR b IS NULL) OR (a IS NULL AND b IS NULL))
Votre propre réponse est incorrecte car elle ne considère pas que FALSE OR NULL est évalué à Inconnu . Par exemple, NULL IS DISTINCT FROM NULL doit être évalué à Faux . De même, 1 IS NOT DISTINCT FROM NULL doit être évalué à Faux . Dans les deux cas, vos expressions donnent Inconnu .