MySQL: selezione di righe in cui una colonna è nulla


277

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, si dice null per la maggior parte delle righe.

La mia query è simile a questa:

SELECT pid FROM planets WHERE userid = NULL

Set vuoto ogni volta.

Molti posti dicevano di assicurarsi che non fosse memorizzato come "NULL" o "null" invece di un valore effettivo, e uno diceva di provare a cercare solo uno spazio ( userid = ' ') ma nessuno di questi ha funzionato. È stato suggerito di non utilizzare MyISAM e utilizzare 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 effettivamente nullo a causa del modo in cui potrebbe convertirlo. Mi piacerebbe farlo senza dover ricreare la tabella come innoDB o altro, ma se devo, posso sicuramente provarlo.


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

Risposte:


523

SQL NULL è speciale, e devi farlo WHERE field IS NULL, poiché NULL non può essere uguale a nulla,

compreso se stesso (ad esempio: NULL = NULL è sempre falso).

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


25
È sconosciuto - Non falso. SQL utilizza tre logiche di valore.
Martin Smith

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

1
vedere anche la risposta di @obe: SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0
Thomas,

Non solo null non è uguale a niente, non è nemmeno uguale a niente. In altre parole, select * from foo where bar <> "abc"sarà non ritorno righe dove bar è nullo. Questo mi ha fatto impazzire oggi. I documenti chiamano <>l'operatore "non uguale a", ma in realtà è l'operatore "è uguale a qualcosa di diverso da".
StackOverthrow


40

Poiché a tutti vengono date risposte, voglio aggiungere poco di più. Avevo anche affrontato lo stesso problema.

Perché la tua query non è riuscita? Hai,

SELECT pid FROM planets WHERE userid = NULL;

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

In SQL, il valore NULL non è mai vero rispetto 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 cercare valori di colonna che sono NULL, non è possibile utilizzare un expr = NULLtest. La seguente istruzione non restituisce righe, perché expr = NULLnon è mai vera per nessuna espressione

Soluzione

SELECT pid FROM planets WHERE userid IS NULL; 

Per verificare NULL, utilizzare gli operatori IS NULLe IS NOT NULL.



11

Informazioni da http://w3schools.com/sql/sql_null_values.asp :

1) I valori NULL rappresentano dati sconosciuti mancanti.

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

3) I valori NULL vengono trattati in modo diverso dagli altri valori

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

5) Non è possibile testare i valori NULL con operatori di confronto, come =, <o <>.

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

Quindi, in caso di tuo problema:

SELECT pid FROM planets WHERE userid IS NULL

7

Ha avuto lo stesso problema in cui la query:

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

non ha restituito valori. Sembra essere un problema con MyISAM e la stessa query sui dati in InnoDB ha restituito i risultati attesi.

Andato con:

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

Ha restituito tutti i risultati attesi.


5
SELECT pid FROM planets WHERE userid is null;

0

Ho avuto lo stesso problema durante la conversione dei 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 affermazione ha funzionato per il mio scenario:

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

1
Se per te ha funzionato, il valore predefinito per il tuo varchar (1) è "" anziché null, quindi non correlato a questa domanda.
さ り げ な い 告白
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.