web-dev-qa-db-fra.com

Expression de cas vs déclaration de cas

Quelle est la différence entre un Case Expression et un Case Statement dans MySQL? Quand peut-on les utiliser et quels sont les avantages de les utiliser les uns par rapport aux autres?

Syntaxe de la déclaration de cas:

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

Syntaxe d'expression de cas:

CASE 
  WHEN [condition] THEN result 
  [WHEN [condition] THEN result ...] 
  [ELSE result] 
END

Celles-ci semblent presque identiques, mais la description initiale des déclarations de cas est que The CASE statement for stored programs implements a complex conditional construct.

Est-ce que la différence significative est que l'un est utilisé dans les programmes stockés et n'est pas utilisable dans les requêtes normales? J'ai essayé cela sur une requête avec laquelle je jouais et cela a échoué - sqlfiddle . Si tel est le cas, pourquoi ne pas simplement utiliser l'expression de cas dans un programme stocké?

Y a-t-il d'autres différences syntaxiques à prendre en compte, car elles semblent identiques?

41
mrmryb

L'expression CASE est évaluée en une valeur, c'est-à-dire qu'elle est utilisée pour évaluer l'un des résultats, en fonction d'une condition.
Exemple:

SELECT CASE
    WHEN type = 1 THEN 'foo'
    WHEN type = 2 THEN 'bar'
    ELSE 'baz'
END AS name_for_numeric_type
FROM sometable`

L'instruction CASE exécute l'une d'un ensemble d'instructions, en fonction d'une condition.
Exemple:

CASE
    WHEN action = 'update' THEN
        UPDATE sometable SET column = value WHERE condition;
    WHEN action = 'create' THEN
        INSERT INTO sometable (column) VALUES (value);
END CASE

Vous voyez comment ils sont similaires, mais l'instruction ne fait pas évalue à une valeur et peut être utilisée seule, tandis que l'expression doit faire partie d'une expression, par ex. une requête ou une affectation. Vous ne pouvez pas utiliser l'instruction dans une requête, car une requête ne peut pas contenir d'instructions, uniquement des expressions qui doivent être évaluées en quelque chose (la requête elle-même est en quelque sorte une instruction), par exemple SELECT CASE WHEN condition THEN UPDATE table SET something; END CASE ça n'a aucun sens.

63
lanzz