2015-05-29 16 views
7

Comprendo che SQL utilizza tre valori di logica ma ho difficoltà a capire come utilizzarlo in pratica, soprattutto perché TRUE || NULL = True e FALSE && NULL = False anziché valutare su null.Esempio di logica a tre valori in SQL Server

Qui ci sono le tre tabelle di verità valore che si applicano a SQL Server:

Tri truth tables

ho trovato un paio spiegazioni dei tre logica valutate online, ma non riesco a trovare nessuna esempi di codice vero e proprio di questo in uso. Qualcuno può mostrarmi un esempio di codice usando tre valori di logica per aiutarmi a capire un po 'meglio?

+2

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) –

+1

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) –

+1

'IF 1 = 2 AND NULL = 1 STAMPA 'TRUE' ELSE PRINT 'FALSE'' –

risposta

4

Un esempio di TRUE || NULL = True sarebbe

declare @x as int = null; 
if 1=1 or @x/1=1 
    print 'true' 

Un esempio di FALSE && NULL = False sarebbe

declare @x as int = null; 
if not(1=2 and @x/1=1) 
    print 'false' 
2

True && NULL non è né True né False. È solo NULL.

La valutazione di True, False o Errore in un'espressione booleana dipende da cosa accade sul sistema quando si valuta NULL da solo come booleano. Sql Server farà tutto il possibile per evitare di scegliere, ma quando forzato praticamente non vedrai mai un risultato positivo (vero).

0

Per utilizzare una variabile nullable è sufficiente controllare le condizioni NULL (utilizzando IS NULL) prima di verificare il valore.

ad es. IF @a IS NOT NULL AND @a = 1

2

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.

2

L'esempio di codice da user4955163 è una grande visualizzazione di questo, però volevo solo tornare indietro nel per indirizzare il primo segmento della domanda:

... soprattutto perché VERO || NULL = vero e falso & & NULL = False invece di valutare null ...

TRUE || NULL = True 

Questo perché l'operatore sarà or cortocircuito se un operando è già noto per essere true. Non importa quale sia il secondo operando (anche se sconosciuto, cioè "NULL"), non renderebbe l'espressione false poiché sappiamo già che l'altro operando è true. or richiede un solo operando per true, da valutare su true.

FALSE && NULL = False 

Ciò è perché l'operatore sarà and cortocircuito se un operando è già noto per essere false. Non importa quale sia il secondo operando (anche se sconosciuto, cioè "NULL"), non renderebbe l'espressione true poiché sappiamo già che l'altro operando è false. and richiede che entrambi gli operandi siano true da valutare su true.

Problemi correlati