2012-02-25 18 views
6

Qual è la differenza tra le seguenti domande & come funziona?NULL vs stringa vuota

SELECT * FROM some_table WHERE col IS NOT NULL 

&

SELECT * FROM some_table WHERE col <> '' 

saluti, Mubarak

risposta

8

Il NULL è tipo di dati speciale, significa assenza di valore.

Una stringa vuota d'altra parte significa una stringa o un valore che è vuoto.

Entrambi sono diversi.

Ad esempio, se nella tabella è presente il campo name e per impostazione predefinita è stato impostato su NULL. Se non viene specificato alcun valore, sarà NULL ma se si specifica un nome reale o una stringa vuota, non sarà NULL, quindi conterrà invece una stringa vuota.

+0

grazie per la vostra risposta. Potresti spiegare con un esempio? – user873779

+0

@ user873779: ho dato un esempio nella mia risposta ma può essere meglio compreso quando lo provi. Crea una tabella, crea un campo, imposta il suo valore predefinito su 'NULL'. Crea due record per quello senza dati es. 'NULL' e uno con stringa vuota ed esegui la tua query. – Sarfraz

+2

Solo una piccola correzione: 'NULL' non è un tipo di dati. –

1

Select * from table where col IS NOT NULL sarebbe tornato resu È escluso da Select * from table where col <> ‘’ perché anche una stringa vuota NON è NULLA.

+0

grazie per la tua risposta. Potresti spiegare con un esempio? – user873779

0

http://data.stackexchange.com/stackoverflow/query/62491/http-stackoverflow-com-questions-9444638-null-vs-empty-in-sql-server

SET NOCOUNT ON; 
DECLARE @tbl AS TABLE (value varchar(50) NULL, description varchar(50) NOT NULL); 

INSERT INTO @tbl VALUES (NULL, 'A Null'), ('', 'Empty String'), ('Some Text', 'A non-empty string'); 

SELECT * FROM @tbl; 
SELECT * FROM @tbl WHERE value IS NOT NULL; 
SELECT * FROM @tbl WHERE value <> ''; 

Si noti che nel display non è possibile distinguere tra NULL e '' - questo è solo un artefatto di come visualizzare il client di rete e di testo dei dati, ma i dati del set viene archiviato diversamente per NULL e ''.

5

NULL è l'assenza di valore e di solito indica qualcosa di significativo, come sconosciuto o non (ancora) determinato. Ad esempio, se inizio oggi un progetto, lo StartDate è 2012-02-25. Se non so quanto tempo impiegherà il progetto, quale dovrebbe essere lo EndDate? Potrei avere un'idea di cosa potrebbe essere ProjectedEndDate, ma imposterò lo EndDate su NULL e lo aggiornerò quando il progetto sarà completato.

'' è una stringa di lunghezza zero (o "vuota"). Non è tecnicamente l'assenza di dati, dal momento che potrebbe effettivamente essere significativo. Ad esempio, se non ho un secondo nome, a seconda del modello di dati '' potrebbe avere più senso di NULL poiché quest'ultimo implica lo sconosciuto ma '' può implicare che è noto che non ne ho uno. NULL può essere utilizzato allo stesso modo, ovviamente, ma è difficile decifrare se non è noto se esiste o se non esiste.Molti standard hanno valori dedicati per le cose in cui potrebbe non essere noto - ad esempio Gender credo che 9 codici di caratteri diversi in modo che se M o F non sono specificati, sappiamo sempre perché (sconosciuto, non specificato, transgender, ecc.) . Pensa anche al caso in cui HeartRate è NULL - è perché non c'era il polso o perché non l'abbiamo ancora preso?

Non sono la stessa cosa, anche se purtroppo molte persone li trattano allo stesso modo. Se la tua colonna consente NULL significa che sai in anticipo che a volte potresti non sapere queste informazioni. Se non li tratti come la stessa cosa, le tue domande sarebbero diverse. Ad esempio se col non consente NULL, la prima query restituirà sempre tutti i risultati nella tabella, poiché nessuno di essi può essere NULL. Tuttavia, NOT NULL consente comunque di immettere una stringa vuota a meno che non sia stato impostato anche un vincolo di controllo per impedire anche le stringhe di lunghezza zero.

Consentendo sia per la stessa colonna è di solito un po 'di confusione per qualcuno che cerca di capire il modello di dati, anche se credo nella maggior parte dei casi un vincolo NOT NULL non è combinata con un vincolo LEN(col)>0 controllo. Il problema se entrambi sono consentiti è che è difficile sapere cosa significa se la colonna è NULL o la colonna è "vuota" - essi potrebbero dire la stessa cosa, ma non possono - e questo varierà da negozio a negozio.

Un altro punto chiave è che NULL rispetto a qualsiasi cosa (almeno per impostazione predefinita in SQL Server *) restituisce lo sconosciuto, che a sua volta restituisce false. A titolo di esempio, queste query tutti ritorno 0:

DECLARE @x TABLE(i INT); 
INSERT @x VALUES(NULL); 

SELECT COUNT(*) FROM @x WHERE i = 1; 
SELECT COUNT(*) FROM @x WHERE i <> 1; 
SELECT COUNT(*) FROM @x WHERE i <= 3; 
SELECT COUNT(*) FROM @x WHERE i > 3; 
SELECT COUNT(*) FROM @x WHERE i IN (1,2,3); 
SELECT COUNT(*) FROM @x WHERE i NOT IN (1,2,3); 

Dal momento che il confronto nella clausola WHERE valutare sempre sconosciuta, essi tornano sempre falsa, quindi nessuna riga sempre soddisfano i criteri e tutti i punti di tornare come 0.

Inoltre, le risposte a questa domanda su dba.stackexchange potrebbero essere utili:

https://dba.stackexchange.com/questions/5222/why-shouldnt-we-allow-nulls

* È possibile modificare questo utilizzando SET ANSI_NULLS OFF - tuttavia questo non è consigliato sia perché fornisce non standard comportamento e perché questa "funzionalità" has been deprecated since SQL Server 2005 e diventerà un no-op in una versione futura di SQL Server. Ma puoi giocare con la query sopra e vedere che lo NOT IN si comporta in modo diverso con SET ANSI_NULLS OFF.

+0

L'esempio di HeartRate è azzeccato. – Alper

0

Come indicato in altre risposte, NULL significa "nessun valore" mentre la stringa vuota '' significa solo che - stringa vuota. Puoi pensare ai campi che consentono NULLs come campi opzionali: possono essere ignorati e il valore per essi potrebbe non essere fornito.

Immaginate un'applicazione in cui il rispondente seleziona il titolo (sig., Sig.ra, signorina, dott.) Ma non è necessario selezionarne uno e lasciarlo in bianco. In questo caso, si inserirà NULL nel campo del database pertinente.

La distinzione tra NULL e stringa vuota potrebbe non essere ovvia perché entrambi possono significare "nessun valore" se si decide di farlo. Dipende interamente da te, ma usare NULL sarebbe meglio soprattutto perché è un caso speciale per i database che sono progettati per gestire NULL in modo rapido ed efficiente (molto più veloce delle stringhe).Se lo usi invece di una stringa vuota, le tue query saranno più veloci e più affidabili.

Problemi correlati