IS DISTINCT FROM predykat został wprowadzony jako funkcja T151 SQL:1999 i jego czytelna negacja, IS NOT DISTINCT FROM , został dodany jako funkcja T152 SQL:2003. Celem tych predykatów jest zagwarantowanie, że wynik porównania dwóch wartości jest albo Prawda lub Fałsz , nigdy Nieznany .
Predykaty te działają z dowolnym porównywalnym typem (w tym wierszami, tablicami i zbiorami multisetów), co sprawia, że ich dokładna emulacja jest dość skomplikowana. Jednak SQL Server nie obsługuje większości tych typów, więc możemy zajść dość daleko, sprawdzając puste argumenty/operandy:
-
a IS DISTINCT FROM bmożna przepisać jako:((a <> b OR a IS NULL OR b IS NULL) AND NOT (a IS NULL AND b IS NULL)) -
a IS NOT DISTINCT FROM bmożna przepisać jako:(NOT (a <> b OR a IS NULL OR b IS NULL) OR (a IS NULL AND b IS NULL))
Twoja własna odpowiedź jest nieprawidłowa, ponieważ nie uwzględnia, że FALSE OR NULL ocenia jako Nieznany . Na przykład NULL IS DISTINCT FROM NULL powinien oceniać jako Fałsz . Podobnie, 1 IS NOT DISTINCT FROM NULL powinien oceniać jako Fałsz . W obu przypadkach Twoje wyrażenia dają Nieznane .