Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment réécrire EST DISTINCT DE et N'EST PAS DISTINCT DE ?

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 b peut ê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 b peut ê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 .