2009-05-12 6 views
0

Gibt es eine Möglichkeit, den Wert aus dem CASE WHEN-Test als eines der Ergebnisse zu verwenden, ohne die SELECT-Anweisung zweimal zu schreiben (da sie lang und unordentlich sein kann)? Zum Beispiel: wie gutGibt es eine Möglichkeit, die CASE WHEN Test eines der Ergebnisse statt zweimal zu machen?

SELECT id, 
    CASE WHEN (
     (SELECT MAX(value) FROM my_table WHERE other_value = 1) IS NOT NULL 
    ) 
    THEN (
     SELECT (MAX(value) FROM my_table WHERE other_value = 1 
    ) 
    ELSE 0 
END AS max_value 
    FROM other_table 

Gibt es eine Möglichkeit ich das Ergebnis des ersten Laufs der SELECT-Anweisung (für den Test) als THEN Wert verwenden kann? Ich habe versucht, "AS max_value" nach dem ersten SELECT, aber es gab mir einen SQL-Fehler.

Update: Whoops, wie Tom H. darauf hingewiesen, ich habe das "IS NOT NULL" in meiner ursprünglichen Frage vergessen.

Antwort

4

Dieses Beispiel zeigt, wie Sie eine Reihe von Werten in einer Unterabfrage vorbereiten können, und sie in einem Fall, in dem äußeren SELECT verwenden.

select 
    orderid, 
    case when maxprice is null then 0 else maxprice end as maxprice 
from (
    select 
     orderid = o.id, 
     maxprice = (select MAX(price) from orderlines ol 
        where ol.orderid = o.id) 
    from orders o 
) sub 

nicht sicher, ob das, was Sie nach, ist die Frage unklar ist (zum Beispiel Ihres 2 MAX() Abfragen erscheint exakte Kopien sein.)

+0

Danke, das war die eigentliche Antwort auf meine Frage, obwohl die COALESCE-Funktion in Tom Hs Antwort ein saubererer Weg ist, dorthin zu gelangen, wo ich eigentlich hin wollte. Ich dachte nicht, sie zuerst in einer Unterabfrage zu definieren. – Charles

5

Läuft Ihre Aussage überhaupt? Es ist kein boolescher Ausdruck in Ihrer CASE-Anweisung. Passt MySQL standardmäßig zum NULL-Wert, wenn Sie keinen booleschen Wert verwenden?

Ich denke, das wahrscheinlich ist, was Sie suchen:

SELECT 
    id, 
    COALESCE(
    (
      SELECT 
       MAX(value) 
      FROM 
       My_Table 
      WHERE 
       other_value = 1 
    ), 0) AS max_value 
FROM 
    Other_Table 
+0

+1 Guten Fang, wahrscheinlich, was er will ! Obwohl es nicht zeigt, wie man das Ergebnis eines einzelnen Falls an zwei Stellen verwendet. – Andomar

+0

Dies ist genau das, was ich wollte - ich wollte den Wert der SELECT-Anweisung verwenden, wenn es nicht NULL war, oder sonst irgendeinen anderen Wert. Danke, dass du meine Gedanken gelesen hast, obwohl ich es nicht klar gemacht habe! – Charles