In generale, da un punto di vista dell'utente, non si desidera che un'espressione booleana venga valutata su NULL.
Scrivere SQL in genere comporta la scrittura di query su evitare esplicitamente i valori NULL nelle espressioni booleane. IMX, gli sviluppatori considererebbero intenzionalmente l'utilizzo di tre logiche valutate come un abuso della logica a tre valori. Una query scritta correttamente dovrebbe gestire i NULL e comprenderli. Non li scrivi in modo tale che funzionino correttamente quando qualcosa è NULL. Di solito questo riguarda COALESCE()
o IS NULL
o IS NOT NULL
da qualche parte.
È tuttavia fondamentale comprendere la logica, poiché i NULL esistono e sono inevitabili per la maggior parte dei dati del mondo reale.
Ad esempio, diciamo che sto lavorando a un tavolo di studenti. La tabella ha i campi Primo, Medio e Ultimo nome. Voglio sapere l'elenco degli studenti che non hanno un secondo nome. Ora alcune applicazioni memorizzeranno una stringa vuota, ''
, e alcune applicazioni memorizzeranno un valore NULL e alcune applicazioni potrebbero eseguire entrambe le operazioni (e alcuni RDBMS come Oracle considerano le stringhe vuote come NULL). Se tu fossi sicuro, si può scrivere come:
SELECT *
FROM Student
WHERE MiddleName = ''
OR MiddleName IS NULL;
L'altro scenario comune è quando sei ESTERNO unirsi a un altro tavolo. Diciamo che stai confrontando gli stipendi per gli insegnanti. Hai una tabella per i controlli e una tabella per CheckDetail. Vuoi sapere quanto gli insegnanti pagano per i benefici. Il vostro rapporto ha bisogno di elencare tutti gli insegnanti, anche se sono imprenditori che non pagano per i benefici, perché non c'è niente:
SELECT Check.Employee_Id,
SUM(CheckDetail.Amount) AS BenefitsDeductions
FROM Check
LEFT JOIN CheckDetail
ON Check.Id = CheckDetail.CheckId
AND CheckDetail.LineItemType = 'Benefits'
GROUP BY Check.Employee_Id;
Si esegue il report, e si nota che i vostri insegnanti contraente mostrano NULL per BenefitsDeductions. Ops.Devi assicurarti che venga visualizzato come zero:
SELECT Check.Employee_Id,
COALESCE(SUM(CheckDetail.Amount),0) AS BenefitsDeductions
FROM Check
LEFT JOIN CheckDetail
ON Check.Id = CheckDetail.CheckId
AND CheckDetail.LineItemType = 'Benefits'
GROUP BY Check.Employee_Id;
Quindi ci provi e funziona. Nessun valore NULL! Ma ... alcuni giorni dopo, i tuoi utenti segnalano che gli insegnanti che erano erano imprenditori e che ora stanno pagando per i benefici. Hai avuto modo di COALESCE prima che la somma per mantenere tali importi:
SELECT Check.Employee_Id,
SUM(COALESCE(CheckDetail.Amount,0)) AS BenefitsDeductions
FROM Check
LEFT JOIN CheckDetail
ON Check.Id = CheckDetail.CheckId
AND CheckDetail.LineItemType = 'Benefits'
GROUP BY Check.Employee_Id;
Trovare questi tipi di casi d'angolo ed eccezioni è ciò che la scrittura SQL è tutto.
C'è anche un articolo nell'articolo collegato che mostra una valutazione vera e sconosciuta dello sconosciuto. (queste cellule http://i.stack.imgur.com/Yd7zq.png) –
False e tutto è falso. Non è necessario considerare le condizioni successive. Vero o qualsiasi cosa è vera. (NB: l'articolo collegato ha un errore nelle tabelle di verità per falso come indicato nei commenti di Hugo Kornelis) –
'IF 1 = 2 AND NULL = 1 STAMPA 'TRUE' ELSE PRINT 'FALSE'' –