Archief - Filter op basis van SQL

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

tghmember

Legacy Member
Hallo alllemaal!

Hoe maak ik een filter op basis van SQL opdrachten?

Meer uitleg:
D.m.v. een query worden verschillende "Spelers" uit een databank gehaald, samen met andere variabelen zoals het team waar hij in zit, de grootte van dat team enzovoort.
Ik heb een filter gemaakt waarin ik elk veld kan filteren. Het moet ook mogelijk zijn om meerdere filters tegelijk te gebruiken. Wanneer ik op de knop FILTER druk, wordt een query uitgevoerd en krijg ik als resultaat alles waar de filter toepassing op heeft. Let wel, één van de filters kan ook leeg zijn, dan moeten alle velden in die bepaalde kolom zichtbaar zijn.
Hoe kan ik dit best aanpakken?

Delphiwizard

Legacy Member
de basis van een sql opdracht is
SELECT
FROM
WHERE

Dus bvb
Select *
From tb_customers
Where name = 'tghmember'

Die where is in uw geval dus belangrijk, je kan daar ook met wildcards werken bvb
Where name like '%memb%'

En je kan meerdere condities hebben
where name like '*memb%' AND city = 'antwerpen'

bealzebub

Legacy Member
Delphiwizard zei:
de basis van een sql opdracht is
SELECT
FROM
WHERE

Dus bvb
Select *
From tb_customers
Where name = 'tghmember'

Die where is in uw geval dus belangrijk, je kan daar ook met wildcards werken bvb
Where name like '%memb%'

En je kan meerdere condities hebben
where name like '*memb%' AND city = 'antwerpen'

Toch even meegeven (aangezien wij met enorme datasets bezig zijn) dat LIKE searches in de meeste relationele (misschien zelfs alle) databases unindexed searches zijn. Kortweg gezegd wil dat zeggen dat om die records te vinden de database elke record individueel moet gaan overlopen om te zien of de voorwaarde(n) voldaan zijn ipv gebruik te kunnen maken van de veel snellere index.

Hoe meer voorwaarden je op een unindexed search toevoegt, hoe trager de query (en hoe zwaarder je de server belast ook trouwens). Soms kan eens niet anders, maar al je het kan vermijden, dan doe je dat beter ook.

Fulltext en fuzzy search doe je beter via een externe indexing engine zoals Solr, ElasticSearch of Sphinx. PostgreSQL heeft wel fulltext indexing (en die is voor een ingebouwde versie zelfs goed), maar de voorgenoemde oplossingen zijn veel uitgebreider en sneller.

Delphiwizard

Legacy Member
Ja, LIKE is uiteraard te vermijden als je kan, en wat ook niet in mijn voorbeeld zat is uppercase/lowercase etc, een where op een lowercase string met waarden in de db die niet lowercase zijn zal ook niet werken.

Alles hangt natuurlijk af van welke db en welke omgeving/taal de ts gebruikt, dat was me niet duidelijk in de openingspost.

Persoonlijk vind ik sql geweldig om mee bezig te zijn, spelen met joins en unions, sorteren, grouping; plezante zaken.

Kort antwoord is dus een where statement opbouwen, met 1 of meedere criteria,afhankelijk van de gekozen zaken

YaMo

Legacy Member
Een deftige db engine kan toch wel indexen gebruiken voor LIKE zolang de % niet in het begin van de string staat?

bealzebub

Legacy Member
YaMo zei:
Een deftige db engine kan toch wel indexen gebruiken voor LIKE zolang de % niet in het begin van de string staat?

Correct (toch met de meest gebruikte relationele databases), maar dat was niet de suggestie van één van de vorige posters. Enkel in het geval van "begint met" (dus waar je geen % in het begin gebruikt) kan de index op dat veld gebruikt worden.

In development kan het daarom nuttig zijn van een optie te voorzien om van elke SQL query een EXPLAIN te loggen (of zelfs automatisch unindexed queries te detecteren).
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan