ProgrammatieSQL ontwikkelaar

Leg uit hoe NULL-verwerking in SQL werkt. Wat zijn de gevaren van onverwachte NULL-waarden, hoe moet je er correct mee omgaan en welke typische fouten komen voor?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

In SQL betekent de waarde NULL "onbekend" of "afwezig". Het gedraagt zich op een bijzondere manier:

  • Vergelijking van NULL met enige waarde via = of <> geeft altijd UNKNOWN terug, en niet TRUE of FALSE.
  • Controleer op aanwezigheid van NULL met IS NULL of IS NOT NULL.
  • Elke rekenkundige of logische bewerking met NULL geeft NULL terug.

Voorbeeld:

SELECT * FROM users WHERE name = NULL; -- retourneert geen rijen SELECT * FROM users WHERE name IS NULL; -- correct SELECT 1 + NULL; -- Resultaat: NULL

Voor het vervangen van NULL worden functies zoals COALESCE(foo, 0) gebruikt (neemt de eerste niet-NULL waarde) of ISNULL(foo, 'default') in SQL Server.

Vraag met een valstrik.

Vraag: Wat is het resultaat van de voorwaarde WHERE some_column <> 'value' in rijen waar some_column - NULL is?

Antwoord:

In deze rijen zal de voorwaarde niet worden uitgevoerd: de vergelijking met NULL geeft UNKNOWN terug, en niet TRUE. Daarom komen rijen met NULL niet in de selectie.

Voorbeeld:

-- some_column | ... -- NULL | ... -- 'abc' | ... -- 'value' | ... SELECT * FROM table WHERE some_column <> 'value'; -- Rij met NULL komt niet binnen

Verhaal

In het bankrapport negeerde de voorwaarde WHERE status <> 'closed' ten onrechte rekeningen met de status = NULL (bijvoorbeeld nieuwe aanvragen). Dit resulteerde in een onjuiste telling van actieve rekeningen — het aantal bleek 15% lager.

Verhaal

In de online service voor personaliseering van e-mails vergaten ze COALESCE(user_name, 'Geachte klant') toe te voegen aan de mailing. Bijna duizend klanten ontvingen begroetingen zonder naam, wat werd opgevat als een fout in de automatisering.

Verhaal

Bij de migratie van de database retourneerde LEFT JOIN meer rijen dan verwacht. Het bleek dat er velden met NULL in de linker tabel waren; filters zoals WHERE b.field = 'X' verwierpen deze rijen na de JOIN, waardoor een deel van de gegevens verloren ging.