2010-08-21 17 views
185

Ho un problema in cui quando provo a selezionare le righe che hanno un NULL per una determinata colonna, restituisce un set vuoto. Tuttavia, quando guardo la tabella in phpMyAdmin, dice null per la maggior parte delle righe.MySQL: selezionare le righe in cui una colonna è nullo

La mia domanda simile a questa:

SELECT pid FROM planets WHERE userid = NULL 

Vuoto set ogni volta.

Un sacco di posti ha detto per assicurarsi che non è memorizzato come "NULL" o "null" invece di un valore effettivo, e uno ha detto di provare a cercare solo uno spazio (userid = ' ') ma nessuno di questi ha funzionato. C'era un suggerimento per non usare MyISAM e usare innoDB perché MyISAM ha problemi a memorizzare null. Ho cambiato la tabella in innoDB, ma ora sento che il problema potrebbe essere che non è ancora nullo a causa del modo in cui potrebbe convertirlo. Mi piacerebbe farlo senza dover ricreare il tavolo come innoDB o qualsiasi altra cosa, ma se devo, posso certamente provarlo.

+1

MyISAM non ha problemi a memorizzare null. La semantica degli stessi NULL dovrebbe essere indipendente dal motore. – MarkR

risposta

396

SQL NULL di speciale, e quello che dovete fare WHERE field IS NULL, come NULL non può essere uguale a qualsiasi cosa,

incluso se stesso (es: NULL = NULL è sempre false).

Vedi Rule 3https://en.wikipedia.org/wiki/Codd%27s_12_rules

+22

È sconosciuto - Non falso. SQL utilizza tre valori di logica. –

+36

NULL = NULL non è veramente FALSE - è di nuovo NULL.Ma non è TRUE, quindi IF (NULL = NULL) non verrà eseguito. – Konerak

+0

vedere anche risposta @obe: SELEZIONA 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 – Thomas

45
SELECT pid FROM planets WHERE userid IS NULL 
7

Info dal http://w3schools.com/sql/sql_null_values.asp:

1) i valori NULL rappresentano dati mancanti sconosciuti.

2) Per impostazione predefinita, una colonna della tabella può contenere valori NULL.

3) i valori NULL sono trattati diversamente dagli altri valori

4) Non è possibile confrontare NULL e 0; non sono equivalenti.

5) Non è possibile verificare i valori NULL con gli operatori di confronto , ad esempio =, < o <>.

6) Dovremo usare la IS NULL e IS NOT operatori NULL invece

Quindi, nel caso del problema:

SELECT pid FROM planets WHERE userid IS NULL 
+0

Grazie, Minhas è molto utile – webblover

+0

molto utile ... thanx – deemi

28

Come tutti sono date risposte che voglio aggiungere poco Di Più. Ho anche affrontato lo stesso problema.

Perché la query ha avuto esito negativo? Hai,

SELECT pid FROM planets WHERE userid = NULL; 

Questo non vi darà il risultato atteso, perché da mysql doc

In SQL, il valore NULL non è mai vero in confronto a qualsiasi altro valore, anche NULL. Un'espressione che contiene NULL produce sempre un valore NULL se non diversamente indicato nella documentazione per gli operatori e le funzioni coinvolte nell'espressione.

Enfasi mia.

Per verificare i valori di colonna che sono NULL, non è possibile utilizzare un test expr = NULL. La seguente dichiarazione non restituisce alcuna riga, perché expr = NULL non è mai vero per qualsiasi espressione

Soluzione

SELECT pid FROM planets WHERE userid IS NULL; 

per verificare NULL, utilizzare gli operatori IS NULL e IS NOT NULL.

0

Ho avuto lo stesso problema quando conversione di database da Access a MySQL (utilizzando vb.net per comunicare con il database).

Avevo bisogno di valutare se un campo (tipo di campo varchar (1)) era nullo.

Questa dichiarazione ha lavorato per il mio scenario:

SELECT * FROM [table name] WHERE [field name] = '' 
+1

Se ciò ha funzionato per te, il valore predefinito per il tuo varchar (1) è "" piuttosto che nullo, quindi non correlato a questa domanda. –

5

avuto lo stesso problema in cui query:

SELECT * FROM 'column' WHERE 'column' IS NULL; 

restituito nessun valore. Sembra essere un problema con MyISAM e la stessa query sui dati in InnoDB ha restituito i risultati previsti.

andato con:

SELECT * FROM 'column' WHERE 'column' = ' '; 

restituito tutti i risultati attesi.

Problemi correlati