Lukas.: mysql: Verschachtelte IF/CASE Query läuft nicht

Hallo,

ich habe eine Query, die ich erweitern möchte:

SELECT 
sum(
(CASE 
WHEN (b.PM = 0 AND b.PA = 'Z') THEN 0
WHEN (b.PM = 0 AND b.PA = 'K') THEN 0
WHEN b.PM = 0 THEN 1
ELSE
b.PM
END)
*Preis
*
...

Nun möchte ich, diesen Teil erweitern:

(CASE 
WHEN (b.PM = 0 AND b.PA = 'Z') THEN 0
WHEN (b.PM = 0 AND b.PA = 'K') THEN 0
WHEN b.PM = 0 THEN 1
ELSE
b.PM
END)
*Preis

Es soll für den Fall, dass (b.PMAW > 0) ist, folgender Code in der Query abgefragt wird:

(CASE 
WHEN (b.PM = 0 AND b.PA = 'Z') THEN 0
WHEN (b.PM = 0 AND b.PA = 'K') THEN 0
WHEN b.PM = 0 THEN 1
ELSE
b.PM
END)
*Preis

Also dachte ich mir, ich füge eine verschachtelte Bedingung ein:

SELECT 
sum(

IF (b.PMAW > 0) THEN
(CASE 
WHEN (b.PM = 0 AND b.PA = 'Z') THEN 0
WHEN (b.PM = 0 AND b.PA = 'K') THEN 0
WHEN b.PM = 0 THEN 1
ELSE
b.PM
END)
*Preis

ELSE

(CASE 
WHEN (b.PM = 0 AND b.PA = 'Z') THEN 0
WHEN (b.PM = 0 AND b.PA = 'K') THEN 0
WHEN b.PM = 0 THEN 1
ELSE
b.PM
END)
*Preis

END IF

*

Aber weder diese Query mit der IF-Bedingung, noch mein vorheriger Versuch mit einer weiteren CASE-THEN-END Bedingung laufen.

Wie kann ich mein Vorhaben umsetzen, bzw. was amche ich falsch?

L.

  1. Tach!

    Also dachte ich mir, ich füge eine verschachtelte Bedingung ein:

    SELECT 
    
    IF (b.PMAW > 0) THEN
    
    END IF
    

    Falsche Syntax, weil in einem SELECT keine Elemente aus Stored Procedures verwendet werden können. Es gibt aber die IF-Funktion für die Anwendung in Statements wie dem SELECT.

    dedlfix.

    1. Hi dedlfix,

      Falsche Syntax, weil in einem SELECT keine Elemente aus Stored Procedures verwendet werden können. Es gibt aber die IF-Funktion für die Anwendung in Statements wie dem SELECT.

      Wunderbar, danke für Deine Hilfe! Nun läufts wie geschnitten Brot. :-)

      L.

  2. Ist es Absicht, dass deine CASE-Konstrukte für PMAW > 0 und PMAW <= 0 gleich sind?

    Abgesehen davon: Lässt es dein fachliches Umfeld zu, aus

    SELECT SUM((CASE 
               WHEN (b.PM = 0 AND b.PA = 'Z') THEN 0
               WHEN (b.PM = 0 AND b.PA = 'K') THEN 0
               WHEN b.PM = 0 THEN 1
               ELSE b.PM
               END) * Preis)
    FROM ...
    

    das hier zu machen:

    SELECT SUM((CASE WHEN b.PM = 0 THEN 1 ELSE b.PM END) * Preis)
    FROMWHERE b.PM != 0 OR b.PA NOT IN ('Z', 'K')
    

    Wäre vermutlich effizienter, weil er die irrelevanten Rows dann gar nicht beachtet.

    Rolf

    1. Hallo Rolf,

      habe Dein Post leider erst gestern abend entdeckt.

      Ist es Absicht, dass deine CASE-Konstrukte für PMAW > 0 und PMAW <= 0 gleich sind?

      Eben natürlich nicht. Das ist auch der Grund, dass ich Dein Post gestern entdeckt habe.

      Abgesehen davon: Lässt es dein fachliches Umfeld zu, aus

      Eher nicht, die Query geht noch ellenlang weiter und ich würde sie erstmal gerne überhaupt zum korrekten Arbeiten überreden.

      Pat