ProgrammatieBI-analist

Hoe optimaliseer je voorwaardelijke selecties met filtering op een lijst van waarden (IN/NOT IN) en ontbrekende gegevens (NULL) voor analyses in grote tabellen?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Achtergrond van de vraag

Vaak is het nodig om queries te formuleren waarbij de filtercriteria dynamisch worden bepaald – de lijst met waarden wordt ingesteld door de interfacegebruiker, en ontbrekende waarden (NULL) moeten ook in de resultaten kunnen verschijnen of niet. Zo'n query moet snel werken bij grote volumes en semantisch correct zijn in termen van SQL.

Probleem

Onjuist combineren van voorwaarden IN, NOT IN en het controleren op NULL leidt tot onverwachte resultaten omdat in SQL de expressie "NULL IN (...)" altijd UNKNOWN retourneert, en "NOT IN" kan leiden tot een lege uitkomst als een van de elementen in de lijst NULL is. De prestaties bij grote data kunnen aanzienlijk dalen met slecht geschreven voorwaarden.

Oplossing

De juiste combinatie ziet er als volgt uit:

  • Als we waarden uit de lijst selecteren, voegen we een voorwaarde voor NULL toe als we ze ook willen retourneren:
SELECT * FROM sales WHERE region IN ('Moscow','Samara') OR region IS NULL;
  • Voor ontkenning gebruiken we expliciete logica:
SELECT * FROM sales WHERE (region NOT IN ('Moscow','Samara') OR region IS NULL);
  • Voor strikte uitsluiting van ontbrekende waarden:
SELECT * FROM sales WHERE region NOT IN ('Moscow','Samara') AND region IS NOT NULL;
  • Voor grote tabellen zijn indexdekking vaak relevant, vooral als de filter op de lijst een veelvoorkomende operatie is.

Belangrijkste punten:

  • We moeten expliciet omgaan met filtering op NULL, anders verliezen we rijen.
  • Correct gebruik van IN en NOT IN is cruciaal voor nauwkeurige selecties.
  • Indexering op velden die deelnemen aan IN/NOT IN versnelt de filtering aanzienlijk.

Vragen met een valstrik.

Wat gebeurt er als we "WHERE field NOT IN ('a', NULL)" controleren?

Het resultaat is altijd leeg, omdat elke rij wordt vergeleken met NULL in de lijst, wat UNKNOWN oplevert en alles filtert.

Voorbeeldcode:

SELECT * FROM test WHERE name NOT IN ('Ivan', NULL);

Geeft "IN (NULL,...)" een waarde voor rijen met NULL?

Nee. De expressie NULL IN (...) retourneert altijd UNKNOWN, niet TRUE.

Hoe kun je filtering versnellen op een grote lijst van waarden?

Gebruik indexen en pas bij voorkeur een JOIN met een tijdelijke tabel toe als de lijst groot is (honderden/tientallen waarden) – dit versnelt de filtering in vergelijking met een lange IN.

Typische fouten en anti-patronen

  • Alleen IN/NOT IN schrijven zonder EXPliciete voorwaarde op NULL
  • De uitvoeringsspecifieke kenmerken van NOT IN met NULL niet in overweging nemen
  • De indexering voor het filterveld niet optimaliseren

Voorbeeld uit het leven

Negatief geval

In een analytisch rapport werd "WHERE city NOT IN ('London', field_2, NULL)" toegepast. Resultaat – volledig lege uitkomst, niemand kon de oorzaak van de verloren rijen begrijpen.

Voordelen:

  • Korte en "leesbare" query

Nadelen:

  • Gegevensverlies, onduidelijke logica voor ontwikkelaars

Positief geval

In de CRM kozen we een lijst van klantregio's en voegden een extra knop "Inclusief ongevulde waarden" toe. De filterlogica:

... WHERE city IN ('SPB','NNov') OR city IS NULL

Voordelen:

  • Flexibele selectie, correcte verwerking van gegevensonvolledigheid
  • Werkt snel door indexering

Nadelen:

  • De logica moet bij elke wijziging van het model worden getest