mysql: Verschachtelte IF/CASE Query läuft nicht
Lukas.
- mysql
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.
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.
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.
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)
FROM …
WHERE b.PM != 0 OR b.PA NOT IN ('Z', 'K')
Wäre vermutlich effizienter, weil er die irrelevanten Rows dann gar nicht beachtet.
Rolf
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