MySQL NOT IN hat ein NULL Problem

Die Arbeit mit SQL-Datenbanken ist super, besonders dann wenn Ausbildung oder Studium abgeschlossen sind und wir anfangen über den Tellerrand hinauszuschauen. Doch manchmal stößt man bei seiner Arbeit mit SQL, in diesem Fall speziell MySQL / MariaDB, auf ein neues merkwürdiges Problem.

In meinem Fall war es die Arbeit mit NOT IN und NULL Werten in einer Datenbank. Bevor wir direkt zur Lösung des Problems kommen, gibt es hier erst einmal eine Beispieltabelle mit Daten.

ID name active
1 Peter NULL
2 Dieter 1
3 Franz 0

Wir sehen wir haben eine Tabelle mit drei Spalten und die Spalte active darf zudem auch NULL sein. Nun stellt sich die Frage was eigentlich passiert, wenn wir eine Abfrage auf active mit NOT IN machen.

SELECT *
FROM `user`
WHERE active NOT IN (1);
ID name active
3 Franz 0

Wider den erwarteten zwei Einträgen, erhalten wir in der Ergebnismenge jedoch nur einen. Wir bekommen nicht den Eintrag mit der ID 1 zurück. Für mich ist dies auf den ersten Blick kein erwartetes Verhalten, allerdings lässt sich das Problem relativ leicht lösen.

SELECT *
FROM `user`
WHERE active NOT IN (1)
   OR active IS NULL;
ID name active
1 Peter NULL
3 Franz 0

Nun bekommen wir den gewünschten Eintrag mit der ID 1 zurück.

Fazit

Wir sehen also, NULL in der Datenbank sollte vermieden werden, gerade in der Kombination mit NOT IN ist es ein Problem. Aus diesem Grund empfiehlt es sich immer mit Default Werten zu arbeiten. Die meisten Datenbanken bieten diese Option an. In dem sehr vereinfachten Beispiel von mir oben ist der active Status NULL mit dem von 0 gleichzusetzen und damit wäre es eindeutig vermeidbar gewesen.