Il problema è che NULL non è considerata uguale a qualsiasi cosa, anche non a se stesso, ma la cosa strana è che è anche non uguale a uguale a se stesso.
Considerare le seguenti dichiarazioni (che è BTW illegale in SQL Server T-SQL ma è valida in My-SQL, tuttavia questo è ciò che ANSI definisce per null e può essere verificato anche in SQL Server utilizzando le istruzioni caso ecc.)
SELECT NULL = NULL -- Results in NULL
SELECT NULL <> NULL -- Results in NULL
è, come ci true false risposta alla domanda /, invece la risposta è anche nullo.
Questo ha molte implicazioni, ad esempio in
- dichiarazioni caso, in cui ogni valore nullo sarà sempre utilizzare la clausola ELSE se non si utilizza esplicitamente la condizione NULL QUANDO (NON la condizione
WHEN NULL
)
- concatenazione di stringhe, come
SELECT a + NULL -- Results in NULL
- In una DOVE IN o WHERE NOT IN clausola, come se si desidera che i risultati corretti assicurarsi nella sottoquery correlata per filtrare eventuali valori nulli.
Si può 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é la deviazione dello standard.
(Come nota laterale, in My-SQL v'è la possibilità di utilizzare un operatore speciale <=>
di confronto nullo.)
In confronto, in linguaggi di programmazione generale nullo viene trattato è un valore normale ed è uguale a se stesso, tuttavia è il valore NAN che non è uguale a se stesso, ma almeno restituisce 'false' quando lo si confronta con se stesso (e quando si verifica che non sia uguale a diversi linguaggi di programmazione hanno implementazioni differenti).
Nota che nelle lingue di base (cioè VB ecc.) Non esiste una parola chiave 'null' e invece si utilizza la parola chiave 'Nothing', che non può essere utilizzata nel confronto diretto e invece è necessario utilizzare 'IS' come in SQL, tuttavia è di fatto uguale a se stesso (quando si usano confronti indiretti).
fonte
2015-04-16 01:01:57
@ Il suggerimento di Luther su COALESCE è migliore della mia risposta. È marginalmente meno efficiente, ma molto più elegante. –
Gestirlo con qualcosa di simile può essere utile, o qualcosa del genere: COALESCE (last_name, '') La dichiarazione del caso, sebbene concisa, è meno manutenibile di COALESCE nelle query di grandi dimensioni. Alla fine, hai lo stesso risultato. Se è necessario ottimizzare, controllare i piani di esecuzione ma non ho notato molta differenza. –
'COALESCE' fondamentalmente si traduce internamente in' CASE'. Il problema con CASE è che 'last_name' viene valutato due volte e può portare ad altri effetti collaterali - vedere questo eccellente [articolo] (http://sqlmag.com/t-sql/coalesce-vs-isnull). Per risolvere ciò che è stato chiesto, preferirei usare 'ISNULL ('' + last_name, '')' menzionato in [comment] (http://stackoverflow.com/questions/3237646/t-sql-case-clause-how -to-specificare-quando-null # comment3343348_3237704) sotto. – miroxlav