2009-05-12 5 views
0

Existe-t-il un moyen d'utiliser la valeur du test CASE WHEN comme l'un de ses résultats sans écrire deux fois l'instruction select (car cela peut être long et salissant)? Par exemple:Y a-t-il un moyen de faire en sorte que le test CASE WHEN teste l'un des résultats plutôt que de l'exécuter deux fois?

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 

Est-il possible que je peux utiliser le résultat de la première exécution de l'instruction SELECT (pour le test) que la valeur THEN ainsi? J'ai essayé d'utiliser "AS max_value" après le premier SELECT mais cela m'a donné une erreur SQL.

Mise à jour: Oups, comme Tom H. l'a souligné, j'ai oublié le "IS NOT NULL" dans ma question initiale.

Répondre

4

Cet exemple montre comment vous pouvez préparer un tas de valeurs dans une sous-requête, et de les utiliser dans un cas dans le SELECT externe.

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 

Je ne sais pas si c'est ce que vous êtes après, la question ne sait pas (par exemple, votre 2 requêtes MAX() semblent être des copies exactes.)

+0

Merci, c'était la vraie réponse à ma question, bien que la fonction COALESCE dans la réponse de Tom H soit une façon plus simple d'arriver là où j'essayais réellement d'aller. Je n'ai pas pensé à les définir dans une sous-requête en premier. – Charles

5

Votre relevé est-il exécuté? Ce n'est pas une expression booléenne dans votre instruction CASE. Est-ce que MySQL vérifie par défaut la valeur NULL si vous n'utilisez pas de booléen?

Je pense que c'est probablement ce que vous cherchez:

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

1 Bonne prise, probablement ce qu'il veut ! Bien qu'il ne montre pas comment utiliser le résultat d'un seul cas à deux endroits. – Andomar

+0

C'est exactement ce que j'allais faire - je voulais utiliser la valeur de l'instruction SELECT si elle n'était pas NULL, ou une autre valeur sinon. Merci d'avoir lu dans mes pensées même si je n'ai pas été clair! – Charles

Questions connexes