Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como reescrever É DISTINTO DE e NÃO É DISTINTO DE?


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 .