Moderne BI- en CRM-systemen vereisen vaak de implementatie van gebruikersfilters: het is belangrijk om willekeurige voorwaarden (over datum, geslacht, status, tags) flexibel te combineren, en ze correct te intersecteren en samen te voegen in SQL. De resulterende code moet leesbaar, gemakkelijk aanpasbaar zijn en het verwachte resultaat opleveren.
Ontwikkelaars vormen vaak "on-the-fly" een WHERE met veel AND/OR van gebruikersfilters, wat leidt tot logische fouten en moeilijke onderhoudbare aanvragen. Het probleem verergert als filterwaarden kunnen ontbreken of gecombineerd kunnen worden met IN/EXISTS/LIKE.
Voor dynamische filters is het handig om het patroon "voorwaarde met OR altijd TRUE als waarde niet is opgegeven":
SELECT * FROM users WHERE (status = @status OR @status IS NULL) AND (gender = @gender OR @gender IS NULL) AND (created >= @from_date OR @from_date IS NULL) AND (city IN (@cities) OR @cities IS NULL);
Of met behulp van dynamische SQL:
DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM users WHERE 1=1'; IF @status IS NOT NULL SET @sql += N' AND status = @status'; IF @gender IS NOT NULL SET @sql += N' AND gender = @gender'; -- ... EXEC sp_executesql @sql, N'@status NVARCHAR(10),@gender NVARCHAR(10)', @status, @gender;
Belangrijke kenmerken:
Kan ik WHERE 1=1 overal gebruiken in plaats van de aanwezigheid van voorwaarden te controleren?
Nee, 1=1 is alleen een startvoorwaarde voor de concatenatie van WHERE — het vervangt geen filters, maar wordt uitsluitend gebruikt voor het gemak van het genereren van verzoeken.
Welke problemen kunnen zich voordoen als er een lege lijst in IN () komt?
IN (NULL) of IN () retourneert altijd false en geeft een lege set terug, zelfs bij afwezigheid van de filter. Voor correcte werking moet je apart controleren of de lijst leeg is en de voorwaarde helemaal niet opnemen.
Hoe beïnvloeden dergelijke constructies het gebruik van indices en prestaties?
Als filters zijn geïmplementeerd met OR of NULL-controles, zullen veel DBMS niet effectief indices gebruiken, of zal er een volledige tabelscan plaatsvinden. Het is raadzaam om benaderingen met dynamische SQL of filters met behulp van geparametriseerde aanvragen toe te passen, zodat de planner een index kan kiezen.
Een klassieke rapportage met 10 filters, de code vormt een WHERE met veel OR — bij afwezigheid van verschillende filters geeft het resultaat een lege set of een veel te grote scan terug, de belasting op de server neemt aanzienlijk toe.
Voordelen:
Een aparte functie genereert filters alleen op basis van opgegeven parameters, en voor elke groep voorwaarden wordt alleen een aparte JOIN/FILTER ingeschakeld. Where bevat geen OR en overbodige NULL-controles.
Voordelen: