web-dev-qa-db-fra.com

Comment fonctionne MySQL CASE?

Je sais que la syntaxe CASE de SQL est la suivante:

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 le considère comme une déclaration if.

Si j'ai un champ dans la table user_role, par exemple, qui contient des noms tels que "Gestionnaire", "Temps partiel", etc., comment générer un champ role_order avec un numéro différent en fonction du rôle Dans le cas de cet exemple, "si user_role = 'Manager' alors role_order = 5".

Veuillez noter que je recherche un enseigne à un homme comment pêcher répond plutôt que donne un poisson à un homme réponse.

63
JD Isaacks

CASE ressemble plus à une instruction switch. Il a deux syntaxes que vous pouvez utiliser. La première vous permet d’utiliser les instructions de comparaison souhaitées:

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 pour quand vous examinez seulement une valeur, et est un peu plus succinct:

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

CASE dans MySQL est à la fois une instruction et une expression , chaque utilisation étant légèrement différente.

En tant qu'instruction, CASE fonctionne beaucoup comme une instruction switch et est utile dans les procédures stockées, comme le montre cet exemple tiré 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;
  |

Toutefois, en tant qu’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

En outre, en tant qu'énoncé et en tant qu'expression, le premier argument peut être omis et chaque variable WHEN doit remplir une condition.

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

J'ai fourni cette réponse car l'autre réponse omet de mentionner que CASE peut fonctionner à la fois comme une déclaration et comme une expression. La principale différence entre eux est que le formulaire de déclaration se termine par END CASE et que le formulaire d’expression se termine par END.

12
Svip

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

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