sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo reescribir ES DISTINTO DE y NO ES DISTINTO DE?

El IS DISTINCT FROM el predicado se introdujo como característica T151 de SQL:1999, y su negación legible, IS NOT DISTINCT FROM , se agregó como característica T152 de SQL:2003. El propósito de estos predicados es garantizar que el resultado de comparar dos valores sea Verdadero o Falso , nunca Desconocido .

Estos predicados funcionan con cualquier tipo comparable (incluidas filas, matrices y conjuntos múltiples), lo que hace que sea bastante complicado emularlos exactamente. Sin embargo, SQL Server no es compatible con la mayoría de estos tipos, por lo que podemos llegar bastante lejos comprobando los argumentos/operandos nulos:

  • a IS DISTINCT FROM b se puede reescribir 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 se puede reescribir como:

    (NOT (a <> b OR a IS NULL OR b IS NULL) OR (a IS NULL AND b IS NULL))
    

Su propia respuesta es incorrecta ya que no considera que FALSE OR NULL se evalúa como Desconocido . Por ejemplo, NULL IS DISTINCT FROM NULL debe evaluarse como Falso . De manera similar, 1 IS NOT DISTINCT FROM NULL debe evaluarse como Falso . En ambos casos, sus expresiones producen Desconocido .