ProgrammierungSQL Entwickler

Erklären Sie, wie die NULL-Verarbeitung in SQL funktioniert. Welche Gefahren bergen unerwartete NULL-Werte, wie sollte man richtig damit umgehen und welche typischen Fehler treten auf?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

In SQL bedeutet der Wert NULL "unbekannt" oder "fehlend". Er verhält sich auf besondere Weise:

  • Der Vergleich von NULL mit jedem Wert über = oder <> ergibt immer das Ergebnis UNKNOWN, und nicht TRUE oder FALSE.
  • Die Überprüfung auf das Vorhandensein von NULL sollte mit IS NULL oder IS NOT NULL erfolgen.
  • Jede arithmetische oder logische Operation mit NULL ergibt NULL.

Beispiel:

SELECT * FROM users WHERE name = NULL; -- gibt keine Zeilen zurück SELECT * FROM users WHERE name IS NULL; -- korrekt SELECT 1 + NULL; -- Ergebnis: NULL

Um NULL zu ersetzen, verwendet man Funktionen wie COALESCE(foo, 0) (nimmt den ersten nicht-NULL-Wert) oder ISNULL(foo, 'default') in SQL Server.

Fangfrage.

Frage: Welches Ergebnis liefert die Bedingung WHERE some_column <> 'value' in Zeilen, wo some_column NULL ist?

Antwort:

In diesen Zeilen wird die Bedingung nicht erfüllt: Der Vergleich mit NULL ergibt UNKNOWN, und nicht TRUE. Daher werden die Zeilen mit NULL nicht in die Auswahl einbezogen.

Beispiel:

-- some_column | ... -- NULL | ... -- 'abc' | ... -- 'value' | ... SELECT * FROM table WHERE some_column <> 'value'; -- Zeile mit NULL wird nicht ausgewählt

Geschichte

Im Bericht der Bank berücksichtigte die Bedingung WHERE status <> 'closed' fälschlicherweise keine Konten mit dem Wert status = NULL (z.B. neue Anträge). Infolgedessen wurde die Anzahl aktiver Konten falsch berechnet – die Zahl stellte sich als 15% niedriger heraus.

Geschichte

Im Internetdienst zur Personalisierung von E-Mails wurde COALESCE(user_name, 'Sehr geehrter Kunde') vergessen hinzuzufügen. Fast tausend Kunden erhielten Ansprachen ohne Namen, was als Fehler der Automatisierung wahrgenommen wurde.

Geschichte

Bei der Migration der Datenbank lieferte LEFT JOIN mehr Zeilen zurück als erwartet. Es stellte sich heraus, dass in der linken Tabelle Felder mit NULL waren; Filter wie WHERE b.field = 'X' nach JOIN wurden diese Zeilen nicht ausgeschlossen, wodurch ein Teil der Daten verloren ging.