Kurt: Frage zu Fallunterscheidung CASE in Query

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

  1. 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.
    
    1. 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

  2. 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

    1. 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
      
    2. 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.

  3. (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.  
    
    
    1. 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