0%

Präzise Fragen stellen · Übung

Suchregeln mit AND und OR kombinieren

Rileys Reparaturaktion kann Werkzeuge gebrauchen, während ein Gemeinschaftsaufbau Veranstaltungsausrüstung gebrauchen kann. Beide Kategorien sind nützlich, aber nur bei einer üblichen Leihdauer von höchstens sieben Tagen. Das ist eine Frage mit zwei alternativen Kategorien und einer Regel, die für beide gilt.

Ersetze die aktuelle WHERE-Zeile in search.sql durch diese Bedingung:

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

Behalte das SELECT mit vier Spalten und FROM items darüber bei und klicke dann auf Run. Die Antwort enthält den Klapptisch, die Stehleiter und den Akkubohrer. Die Projektionsleinwand mit vierzehn Tagen gehört zur Veranstaltungsausrüstung, erfüllt aber die Regel zur Leihdauer nicht.

Die Wörter OR und AND kombinieren Vergleiche. Innerhalb der Klammern erlaubt OR jede der beiden benannten Kategorien. Nach dieser Auswahl verlangt AND loan_days <= 7, dass die ausgewählte Zeile auch das Zeitlimit erfüllt. Die Klammern machen die beabsichtigte Gruppierung sichtbar: Für beide alternativen Kategorien gilt dasselbe Limit.

Verfolge drei Zeilen durch diesen Satz, bevor du über Operatorregeln nachdenkst. Ein Werkzeug mit drei Tagen erfüllt sowohl die Kategorieauswahl als auch das Zeitlimit. Ein Veranstaltungsgegenstand mit vierzehn Tagen erfüllt die Kategorieauswahl, verfehlt aber das Limit. Ein Elektronikgegenstand mit zwei Tagen erfüllt das Limit, verfehlt aber die Kategorieauswahl. Eine Zeile gelangt nur in die Antwort, wenn beide Teile erfolgreich sind.

Ohne sie würde diese Bedingung etwas anderes sagen:

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

SQLite wertet AND vor OR aus. Diese Variante würde jedes Werkzeug zulassen, sogar eines mit dreißig Tagen Leihdauer, und nur Veranstaltungsgegenstände begrenzen. Der sichtbare Katalog enthält kein Werkzeug mit langer Leihdauer, sodass der Fehler hier verborgen bleiben könnte. Submit enthält eines und macht den Unterschied damit sichtbar.

Klammern erfüllen dieselbe Aufgabe wie in einem Python-Ausdruck: Sie treffen eine kleinere Entscheidung, bevor die umgebende Entscheidung sie verwendet. Du fügst keine Dekoration für die Lesenden hinzu. Du hältst die Gruppierung fest, die der Bedingung ihre Bedeutung gibt.

Auch der Grenzwert gehört zur Frage. <= 7 schließt einen Gegenstand mit genau sieben Tagen Leihdauer ein. < 7 würde den Klapptisch und den Akkubohrer stillschweigend entfernen.

Lies die vollständige Bedingung vor dem Einreichen in Alltagssprache: Die Kategorie ist Werkzeuge oder Veranstaltungsausrüstung, und die Leihdauer beträgt höchstens sieben Tage. Vergleiche diesen Satz dann mit den Klammern und Operatoren in deinem SQL.

Wenn Run die Projektionsleinwand einschließt, konzentriere dich auf loan_days <= 7. Wenn es alle Veranstaltungsgegenstände ausschließt, konzentriere dich auf das OR innerhalb der Klammern. Ein sichtbares Symptom nach dem anderen zu prüfen geht schneller, als alle Operatoren auf einmal umzustellen.

Das ist eine zusammengesetzte Bedingung: Mehrere kleinere Vergleiche entscheiden gemeinsam, ob eine Zeile ins Ergebnis gehört. Der Name ist weniger wichtig als die Gewohnheit, die du gerade geübt hast. Schreibe die Gruppierung so, dass andere nicht raten müssen, welche Regel für welche Alternativen gilt.

Aufgabe

Ändere den Filter in search.sql so, dass er Werkzeuge oder Veranstaltungsgegenstände nur behält, wenn loan_days höchstens 7 ist.

Setze Klammern um die beiden alternativen Kategorien, führe dann die vollständige Abfrage aus und reiche sie ein.