0%

Stel precieze vragen · oefening

Combineer zoekregels met AND en OR

Voor Rileys reparatiesessie is gereedschap bruikbaar, terwijl voor een buurtactiviteit materiaal voor evenementen van pas komt. Beide categorieën zijn nuttig, maar alleen als de gebruikelijke uitleentermijn zeven dagen of korter is. Dat is één vraag met twee alternatieve categorieën en één regel die voor beide geldt.

Vervang de huidige WHERE-regel in search.sql door deze voorwaarde:

WHERE (category = 'tools' OR category = 'events')
  AND loan_days <= 7;

Laat de SELECT met vier kolommen en FROM items erboven staan en druk op Run. Het antwoord bevat de klaptafel, trapladder en accuboormachine. Het projectiescherm met een termijn van veertien dagen is materiaal voor evenementen, maar voldoet niet aan de regel voor de uitleentermijn.

De woorden OR en AND combineren vergelijkingen. Binnen de haakjes laat OR elk van de twee genoemde categorieën toe. Na die keuze vereist AND loan_days <= 7 dat de gekozen rij ook aan de termijnlimiet voldoet. De haakjes maken de bedoelde groepering zichtbaar: voor beide alternatieve categorieën geldt dezelfde limiet.

Volg drie rijen door die zin voordat je over operatorregels nadenkt. Gereedschap met een termijn van drie dagen voldoet aan de categoriekeuze en aan de termijnlimiet. Materiaal voor evenementen met een termijn van veertien dagen voldoet aan de categoriekeuze, maar niet aan de limiet. Een elektronisch voorwerp met een termijn van twee dagen voldoet aan de limiet, maar niet aan de categoriekeuze. Een rij komt alleen in het antwoord wanneer beide delen slagen.

Zonder de haakjes zou deze voorwaarde iets anders zeggen:

WHERE category = 'tools'
   OR category = 'events' AND loan_days <= 7;

SQLite evalueert AND vóór OR. Die versie zou elk stuk gereedschap toelaten, zelfs gereedschap met een termijn van dertig dagen, terwijl alleen materiaal voor evenementen wordt beperkt. De zichtbare catalogus bevat geen gereedschap met een lange termijn, dus de fout kan hier verborgen blijven. Submit bevat zo’n voorwerp wel, waardoor het verschil zichtbaar wordt.

Haakjes doen hetzelfde als in een Python-expressie: ze laten eerst een kleinere beslissing nemen voordat de omliggende beslissing die gebruikt. Je voegt geen versiering voor de lezer toe. Je legt de groepering vast die de voorwaarde haar betekenis geeft.

De grenswaarde is ook onderdeel van de vraag. <= 7 neemt een voorwerp mee waarvan de termijn precies zeven dagen is. Met < 7 zou je ongemerkt de klaptafel en accuboormachine verwijderen.

Lees de volledige voorwaarde voor het insturen in gewone taal: de categorie is gereedschap of evenementen en de uitleentermijn is hoogstens zeven dagen. Vergelijk die zin daarna met de haakjes en operatoren in je SQL.

Als Run het projectiescherm meeneemt, richt je dan op loan_days <= 7. Als al het materiaal voor evenementen ontbreekt, richt je dan op de OR tussen de haakjes. Eén zichtbaar symptoom tegelijk controleren gaat sneller dan alle operatoren tegelijk verplaatsen.

Dit is een samengestelde voorwaarde: meerdere kleinere vergelijkingen bepalen samen of één rij in het resultaat thuishoort. De naam is minder belangrijk dan de gewoonte die je zojuist hebt geoefend. Schrijf de groepering zo op dat een andere lezer niet hoeft te raden welke regel voor welke alternatieven geldt.

Opdracht

Verander het filter in search.sql, zodat het alleen gereedschap of materiaal voor evenementen behoudt wanneer loan_days hoogstens 7 is.

Zet haakjes om de twee alternatieve categorieën, voer daarna de volledige query uit en stuur hem in.