Vinzenz Mai: Frage zu Fallunterscheidung CASE in Query

Beitrag lesen

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