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 .