O
IS DISTINCT FROM
o predicado foi introduzido como recurso T151 do SQL:1999 e sua negação legível, IS NOT DISTINCT FROM
, foi adicionado como recurso T152 do SQL:2003. O objetivo desses predicados é garantir que o resultado da comparação de dois valores seja True ou Falso , nunca Desconhecido . Esses predicados funcionam com qualquer tipo comparável (incluindo linhas, matrizes e multiconjuntos), tornando bastante complicado emulá-los exatamente. No entanto, o SQL Server não suporta a maioria desses tipos, então podemos ir muito longe verificando argumentos/operandos nulos:
-
a IS DISTINCT FROM b
pode ser reescrita como:
((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
pode ser reescrita como:
(NOT (a <> b OR a IS NULL OR b IS NULL) OR (a IS NULL AND b IS NULL))
Sua própria resposta está incorreta, pois não considera que
FALSE OR NULL
avalia como Desconhecido . Por exemplo, NULL IS DISTINCT FROM NULL
deve avaliar como Falso . Da mesma forma, 1 IS NOT DISTINCT FROM NULL
deve avaliar como Falso . Em ambos os casos, suas expressões geram Desconhecido .