MySQL: Auswahl von Zeilen, in denen eine Spalte null ist


270

Ich habe ein Problem, bei dem beim Versuch, die Zeilen auszuwählen, die für eine bestimmte Spalte einen NULL-Wert haben, eine leere Menge zurückgegeben wird. Wenn ich mir jedoch die Tabelle in phpMyAdmin ansehe, heißt es für die meisten Zeilen null.

Meine Anfrage sieht ungefähr so ​​aus:

SELECT pid FROM planets WHERE userid = NULL

Leeres Set jedes Mal.

Viele Stellen sollen sicherstellen, dass es nicht als "NULL" oder "null" anstelle eines tatsächlichen Werts gespeichert wird, und man soll versuchen, nur nach einem Leerzeichen ( userid = ' ') zu suchen, aber keines davon hat funktioniert. Es gab einen Vorschlag, MyISAM nicht zu verwenden und innoDB zu verwenden, da MyISAM Probleme beim Speichern von Null hat. Ich habe die Tabelle auf innoDB umgestellt, aber jetzt habe ich das Gefühl, dass das Problem möglicherweise darin besteht, dass sie aufgrund der Art und Weise, wie sie konvertiert wird, immer noch nicht null ist. Ich würde dies gerne tun, ohne die Tabelle als innoDB oder irgendetwas anderes neu erstellen zu müssen, aber wenn ich muss, kann ich das auf jeden Fall versuchen.


1
MyISAM hat keine Probleme beim Speichern von Null. Die Semantik von NULLs selbst sollte unabhängig von der Engine sein.
MarkR

Antworten:


512

SQL NULL ist etwas Besonderes, und Sie müssen es tun WHERE field IS NULL, da NULL mit nichts gleich sein kann.

einschließlich sich selbst (dh: NULL = NULL ist immer falsch).

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


24
Es ist unbekannt - nicht falsch. SQL verwendet drei wertige Logik.
Martin Smith

38
NULL = NULL ist nicht wirklich FALSE - es ist wieder NULL. Aber es ist auch nicht WAHR, also wird IF (NULL = NULL) nicht ausgeführt.
Konerak

1
siehe auch @obe Antwort: SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0
Thomas

Null ist nicht nur nichts gleich, es ist auch nichts gleich. Mit anderen Worten, es select * from foo where bar <> "abc"werden keine Zeilen zurückgegeben, in denen der Balken null ist. Das warf mich heute für eine Schleife. Die Dokumente nennen <>den Operator "ungleich", aber in Wirklichkeit ist es der Operator "ist gleich etwas anderem als".
StackOverthrow


39

Da alle Antworten erhalten, möchte ich noch etwas hinzufügen. Ich hatte auch das gleiche Problem konfrontiert.

Warum ist Ihre Abfrage fehlgeschlagen? Du hast,

SELECT pid FROM planets WHERE userid = NULL;

Dies gibt Ihnen nicht das erwartete Ergebnis, da aus MySQL-Dokument

In SQL ist der NULL-Wert im Vergleich zu anderen Werten, auch nicht NULL, niemals wahr. Ein Ausdruck, der NULL enthält, erzeugt immer einen NULL-Wert, sofern in der Dokumentation für die am Ausdruck beteiligten Operatoren und Funktionen nichts anderes angegeben ist.

Hervorhebung von mir.

Um nach Spaltenwerten zu suchen NULL, können Sie keinen expr = NULLTest verwenden. Die folgende Anweisung gibt keine Zeilen zurück, da sie expr = NULLfür keinen Ausdruck gilt

Lösung

SELECT pid FROM planets WHERE userid IS NULL; 

NULLVerwenden Sie zum Testen die Operatoren IS NULLund IS NOT NULL.



11

Infos von http://w3schools.com/sql/sql_null_values.asp :

1) NULL-Werte repräsentieren fehlende unbekannte Daten.

2) Standardmäßig kann eine Tabellenspalte NULL-Werte enthalten.

3) NULL-Werte werden anders behandelt als andere Werte

4) Es ist nicht möglich, NULL und 0 zu vergleichen. Sie sind nicht gleichwertig.

5) Es ist nicht möglich, mit Vergleichsoperatoren wie =, <oder <> auf NULL-Werte zu testen.

6) Wir müssen stattdessen die Operatoren IS NULL und IS NOT NULL verwenden

Also im Falle Ihres Problems:

SELECT pid FROM planets WHERE userid IS NULL

7

Hatte das gleiche Problem bei der Abfrage:

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

gab keine Werte zurück. Es scheint ein Problem mit MyISAM zu sein, und dieselbe Abfrage der Daten in InnoDB ergab die erwarteten Ergebnisse.

Ging mit:

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

Alle erwarteten Ergebnisse zurückgegeben.



0

Ich hatte das gleiche Problem beim Konvertieren von Datenbanken von Access nach MySQL (Verwenden von vb.net für die Kommunikation mit der Datenbank).

Ich musste beurteilen, ob ein Feld (Feldtyp varchar (1)) null war.

Diese Aussage hat für mein Szenario funktioniert:

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

1
Wenn das für Sie funktioniert hat, ist die Standardeinstellung für Ihr varchar (1) '' und nicht null, daher hängt es nicht mit dieser Frage zusammen.
告白 り げ な い 告白
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.