Frage zu Fallunterscheidung CASE in Query
Kurt
- datenbank
Hallo,
(CASE
WHEN pgd = 'R' THEN 1
WHEN (pgd = 'R' AND cond = 'RZ') THEN 0
WHEN (pgd = 'R' AND cond = 'RK') THEN 0
ELSE
pgd
END)
*
Rest der Query
Was ich möchte:
Wenn die Spalte 'pgd' den Inhalt 'R' hat, soll der Faktor 1 genommen werden, es sei denn, dass in der betreffenden Zeile die Spalte 'cond' den Inhalt 'RZ' oder 'RK' hat. Dann soll nämlich der Faktor 0 genommen werden.
Lieder wird immer der Faktor 1 genommen.
Habe ich eine fehlerhafte Syntax oder einen Logigfehler in der Query?
Kurt
Tach!
(CASE
WHEN pgd = 'R' THEN 1
WHEN (pgd = 'R' AND cond = 'RZ') THEN 0
WHEN (pgd = 'R' AND cond = 'RK') THEN 0
ELSE
pgd
END)
> Wenn die Spalte 'pgd' den Inhalt 'R' hat, soll der Faktor 1 genommen werden, es sei denn, dass in der betreffenden Zeile die Spalte 'cond' den Inhalt 'RZ' oder 'RK' hat. Dann soll nämlich der Faktor 0 genommen werden.
> Habe ich eine fehlerhafte Syntax oder einen Logigfehler in der Query?
Im Handbuch steht leider nicht, in welcher Reihenfolge die Bedingungen ausgewertet werden. Ich nehme auch nicht an, dass MySQL sie nach irgendeinem Kriterium umsortiert. Gesetzt also denn Fall, die Auswertung passiert der Reihe nach, dann trifft bereits die erste Bedingung zu und weitere Fälle müssen nicht abgearbeitet werden. Probier mal, die beiden anderen nach oben zu schieben. Wenn das nicht zum gewünschten Ergebnis führt, nimm verschachtelte IF()-Funktionen.
dedlfix.
Hallo dedlfix,
Im Handbuch steht leider nicht, in welcher Reihenfolge die Bedingungen ausgewertet werden [...] Probier mal, die beiden anderen nach oben zu schieben.
Auf Dich ist in Datenbankfragen wirklich Verlass.
Danke. Das nach oben schieben brachte den gewünschten Erfolg!
Schönen Tag, Kurt
Hallo,
(CASE
WHEN pgd = 'R' THEN 1
WHEN (pgd = 'R' AND cond = 'RZ') THEN 0 -- kann nie eintreten
WHEN (pgd = 'R' AND cond = 'RK') THEN 0 -- kann nie eintreten
ELSE
pgd
END)
*
Rest der Query
> Wenn die Spalte 'pgd' den Inhalt 'R' hat, soll der Faktor 1 genommen werden, es sei denn, dass in der betreffenden Zeile die Spalte 'cond' den Inhalt 'RZ' oder 'RK' hat. Dann soll nämlich der Faktor 0 genommen werden.
>
> Lieder wird immer der Faktor 1 genommen.
nö, der ELSE-Fall dürfte auch eintreten
> Habe ich eine fehlerhafte Syntax oder einen Logigfehler in der Query?
einen Logikfehler. Deine Abfrage ist äquivalent zu:
~~~sql
(CASE
WHEN pgd = 'R' THEN 1
ELSE pgd
END)
da in Deiner Form CASE das Ergebnis für den ersten zutreffenden Zweig zurückliefert, siehe Handbuch:
<zitat>
The second version returns the result for the first condition that is
true. If there was no matching result value, the result after ELSE is
returned, or NULL if there is no ELSE part.
</zitat>
Da Dein zweiter und dritter Fall nur zutreffen können, wenn der erste zutrifft, werden diese beiden Zweige nie beschritten. Du musst die speziellen Fälle somit vor dem allgemeineren Fall notieren
(CASE
WHEN (pgd = 'R' AND cond = 'RZ') THEN 0
WHEN (pgd = 'R' AND cond = 'RK') THEN 0
WHEN pgd = 'R' THEN 1
ELSE pgd
END
So solltest Du das von Dir gewünschte Ergebnis erhalten.
Freundliche Grüße
Vinzenz
einen Logikfehler. Deine Abfrage ist äquivalent zu:
(CASE
WHEN pgd = 'R' THEN 1
ELSE pgd
END)
>
Hallo Vincent,
auch an Dich nochmal ein herzliches Dankeschön!
Du hast den Nagel auf den Kopf getroffen, meine Abfrage war genau äquivalent zu obiger.
Nun passt es.
Gruß, Kurt
Tach!
<zitat>
The second version returns the result for the first condition that is
true. If there was no matching result value, the result after ELSE is
returned, or NULL if there is no ELSE part.
</zitat>
Ha, hab ich das doch glatt überlesen. Ich dachte, der Satz und der vorhergehende beschreiben nur die zwei Syntaxvarianten, hab ihn ignoriert und anderswo nach einem Hinweis zur Reihenfolge gesucht.
dedlfix.
(CASE
WHEN pgd = 'R' THEN 1
WHEN (pgd = 'R' AND cond = 'RZ') THEN 0
WHEN (pgd = 'R' AND cond = 'RK') THEN 0
ELSE
pgd
END)
Du gibst da einmal eine Zahl zurück (0 und 1) und dann pgd, das offensichtlich ein String ist. Ist das so gedacht? Kommt mir nämlich etwas seltsam vor.
Du gibst da einmal eine Zahl zurück (0 und 1) und dann pgd, das offensichtlich ein String ist. Ist das so gedacht? Kommt mir nämlich etwas seltsam vor.
Lach... gut bemerkt ;-)
Ja, ist so gedacht. Alles ok. Aber cool, das bemerkt zu haben.
Kurt