Il problema è che NULL non è considerato uguale a niente, nemmeno a se stesso, ma la strana parte è che non è uguale a se stesso.
Considerare le seguenti dichiarazioni (che è BTW illegale in SQL Server T-SQL ma è valido in My-SQL, tuttavia questo è ciò che ANSI definisce per null e può essere verificato anche in SQL Server utilizzando le istruzioni case ecc.)
SELECT NULL = NULL -- Results in NULL
SELECT NULL <> NULL -- Results in NULL
Quindi non esiste una risposta vera / falsa alla domanda, ma anche la risposta è nulla.
Ciò ha molte implicazioni, ad esempio in
- Istruzioni CASE, in cui qualsiasi valore null utilizzerà sempre la clausola ELSE a meno che non si utilizzi esplicitamente la condizione WHEN IS NULL ( NON la
WHEN NULL
condizione )
- Concatenazione di stringhe, come
SELECT a + NULL -- Results in NULL
- In una clausola WHERE IN o WHERE NOT IN, come se si desiderassero risultati corretti assicurarsi che nella sottoquery correlata filtrare eventuali valori null.
È possibile ignorare questo comportamento in SQL Server specificando SET ANSI_NULLS OFF
, tuttavia questo NON è raccomandato e non dovrebbe essere fatto in quanto può causare molti problemi, semplicemente perché deviazione dello standard.
(Come nota a margine, in My-SQL c'è un'opzione per usare un operatore speciale <=>
per il confronto null.)
In confronto, in generale i linguaggi di programmazione null è trattato è un valore regolare ed è uguale a se stesso, tuttavia è il valore NAN che non è uguale a se stesso, ma almeno restituisce "falso" quando lo confronta con se stesso (e quando si verifica che non sia uguale a linguaggi di programmazione diversi hanno implementazioni diverse).
Si noti tuttavia che nei linguaggi di base (ad es. VB ecc.) Non esiste una parola chiave "null" e si utilizza invece la parola chiave "Nothing", che non può essere utilizzata nel confronto diretto e invece è necessario utilizzare "IS" come in SQL, tuttavia è in effetti uguale a se stesso (quando si usano confronti indiretti).