Problem in MSSQL

yellowspam

Erfahrenes Mitglied
Hi@all:
Ich arbeite grade an diesem Übungsbsp. mit folgender Angabe:

Die Datenbank einer Scherzartikelhandlung enthält die Tabelle Lager, die im folgenden dargestellt ist:

Name Farbe Preis Menge
Springfrosch grün 80 25
Stinkfrosch braun 60 20
Knallfrosch grün 70 40
Klebeschlange schwarz 115 30
Juckpulver rot 60 50
Schleimblume grün 120 34

Erstellen Sie eine SQL-artige Abfrage, die Name und Menge aller Artikel des Lagers liefert, die grün oder schwarz sind und weniger als 120 Schilling kosten.

So nun habe ich die Tabelle erstellt und auch den Code schon geschrieben aber ich habe ein Problem: ich bekomme auch die Schleimblume angezeigt,obwohl diese genau 120 Schilling kostet.

Hier der Code:

Code:
SELECT  L.Name,L.Menge FROM Lager as L
WHERE L.Farbe='grün'
OR L.Farbe='schwarz'
AND L.Preis < 120

Meine Frage lautet also: Was habe ich vergessen/ falsch gemacht?
 
Ich denke bei Zahlenwerten sind die Quotes nicht erforderlich?

Es hat leider nicht gefuntzt, die Schleimblume wird immer noch angezeigt.:(
 
Hallo,

bei Zahlenwerten brauchst / solltest du nicht quoten, da auch eine implizite Konvertierung vorgenommen würde, die zu Seiteneffekten führen kann.

Wie ich schon vor kurzem in einem anderen Thread beantwortet hab, sieht es danach aus, dass du die Operatoren-Reihenfolge nicht beachtet hast. Das AND bindet stärker, daher sucht die DBMS nach Einträgen, bei denen:

- L.Farbe='grün' ODER
- L.Farbe='schwarz' UND L.Preis < 120

Daher wird die Schleimblume angezeigt.

Was du willst ist wahrscheinlich folgendes:

SQL:
SELECT L.Name,
       L.Menge 
  FROM Lager as L
 WHERE ( L.Farbe='grün' OR L.Farbe='schwarz' )
   AND L.Preis < 120

Das OR kannst du dann mittelns "IN"-Operator auch noch eliminieren:

SQL:
SELECT L.Name,
       L.Menge 
  FROM Lager as L
 WHERE L.Farbe IN ('grün','schwarz')
   AND L.Preis < 120

Markus
 
Zuletzt bearbeitet:
Hallo nochmal,

das Problem an deiner Abfrage wird sich auch nicht durch eie andere Reihenfolge lösen lassen, da du einfach eine andere Kombination von Werten testen möchtest.

Es ist unerheblich, ob du für deinen Fall schreibst, da das AND in jedem Falle stärker bindet.

SQL:
...
WHERE farbe = 'rot' OR
      farbe = 'grün'  AND preis < 120;

oder

SQL:
...
WHERE farbe = 'grün'  AND preis < 120 OR
      farbe = 'rot';

Richtig würde es mit dieser Schreibweise daher nur werden, wenn du schreibst:

SQL:
...
WHERE farbe = 'grün'  AND preis < 120 OR
      farbe = 'rot'   AND preis < 120;

... und das kann man dann wie beschrieben zusammen fassen zu den zuletzt von mir geposteten Varianten.

Markus
 
Zurück