Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come riscrivere È DISTINTO DA e NON È DISTINTO DA?

Il IS DISTINCT FROM predicato è stato introdotto come caratteristica T151 di SQL:1999 e la sua negazione leggibile, IS NOT DISTINCT FROM , è stata aggiunta come funzionalità T152 di SQL:2003. Lo scopo di questi predicati è garantire che il risultato del confronto di due valori sia Vero o Falso , mai Sconosciuto .

Questi predicati funzionano con qualsiasi tipo comparabile (inclusi righe, array e multiset) rendendo piuttosto complicato emularli esattamente. Tuttavia, SQL Server non supporta la maggior parte di questi tipi, quindi possiamo andare molto lontano controllando argomenti/operandi nulli:

  • a IS DISTINCT FROM b può essere riscritto come:

    ((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 può essere riscritto come:

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

La tua stessa risposta non è corretta in quanto non considera che FALSE OR NULL restituisce Sconosciuto . Ad esempio, NULL IS DISTINCT FROM NULL dovrebbe valutare Falso . Allo stesso modo, 1 IS NOT DISTINCT FROM NULL dovrebbe valutare Falso . In entrambi i casi, le tue espressioni restituiscono Sconosciuto .