2010-08-02 8 views
56

Je sais que la syntaxe de SQL CASE est la suivante:Comment fonctionne MySQL CASE?

CASE 
    WHEN search_condition THEN statement_list 
    [WHEN search_condition THEN statement_list] ... 
    [ELSE statement_list] 
END CASE 

Cependant, je ne comprends pas comment cela fonctionne, peut-être parce que je pense à ce sujet comme au sujet d'une déclaration if. Par exemple, si j'ai un champ dans la table user_role qui contient des noms tels que "Manager", "Part Time", etc., comment puis-je générer un champ role_order avec un nombre différent selon le rôle. Dans le cas de cet exemple, "if user_role = 'Manager' puis role_order = 5".

S'il vous plaît noter que je cherche enseigner un homme à pêcher réponse plutôt que donner à un homme une réponse poisson.

Répondre

101

CASE ressemble plus à une instruction switch. Il a deux syntaxes que vous pouvez utiliser. La première vous permet d'utiliser tout comparer les déclarations que vous voulez:

CASE 
    WHEN user_role = 'Manager' then 4 
    WHEN user_name = 'Tom' then 27 
    WHEN columnA <> columnB then 99 
    ELSE -1 --unknown 
END 

Le second style est quand vous examinez une seule valeur, et est un peu plus succincte:

CASE user_role 
    WHEN 'Manager' then 4 
    WHEN 'Part Time' then 7 
    ELSE -1 --unknown 
END 
+1

Ce que vous dites est logique, je suis encore confus au sujet où il va à l'intérieur du reste de la requête que j'ai essayé 'SELECT *, votre code AS role_order FROM table' Mais je continue d'avoir des erreurs. Pouvez-vous montrer un exemple en utilisant une requête entière? Je vous remercie! –

+7

Je l'ai compris, vous êtes censé finir avec "FIN" pas "END CAS" http://dev.mysql.com/doc/refman/5.0/fr/case-statement.html Merci! –

+0

Pour ceux qui n'ont pas lu les documents ci-dessus, vous ne pouvez pas lire ce commentaire, mais au cas où: Remarquez qu'il existe deux formes différentes de 'CASE', avec une syntaxe très similaire, mais un but/usage quelque peu différent. .. Voir aussi [cette question] (http://stackoverflow.com/q/12436859/2359271). – Air

12

CASE dans MySQL est à la fois un statement et un expression, où chaque utilisation est légèrement différente.

Comme une déclaration, CASE fonctionne comme une instruction switch et est utile dans les procédures stockées, comme le montre cet exemple de la documentation (lien ci-dessus):

DELIMITER | 

CREATE PROCEDURE p() 
    BEGIN 
    DECLARE v INT DEFAULT 1; 

    CASE v 
     WHEN 2 THEN SELECT v; 
     WHEN 3 THEN SELECT 0; 
     ELSE 
     BEGIN -- Do other stuff 
     END; 
    END CASE; 
    END; 
    | 

Cependant, comme une expression, il peut être utilisé dans les clauses:

SELECT * 
    FROM employees 
    ORDER BY 
    CASE title 
     WHEN "President" THEN 1 
     WHEN "Manager" THEN 2 
     ELSE 3 
    END, surname 

de plus, à la fois comme une déclaration et comme une expression, le premier argument peut être omis et chaque WHEN doit prendre une condition.

SELECT * 
    FROM employees 
    ORDER BY 
    CASE 
     WHEN title = "President" THEN 1 
     WHEN title = "Manager" THEN 2 
     ELSE 3 
    END, surname 

Je fourni cette réponse parce que l'autre réponse ne mentionne pas que CASE peut fonctionner à la fois comme une déclaration et comme une expression. La différence majeure entre eux est que le formulaire de déclaration se termine par END CASE et le formulaire d'expression se termine par END.

0

Je voulais un exemple simple de l'utilisation de cas que je pourrais jouer avec, cela n'a même pas besoin d'une table. Cela revient pair ou impair selon que secondes est impair ou même

SELECT CASE MOD(SECOND(NOW()),2) WHEN 0 THEN 'odd' WHEN 1 THEN 'even' END;