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 b
moż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 b
moż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 .