¿Cómo funciona el CASO MySQL?


Sé que la sintaxis de SQL CASE es la siguiente:

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

Sin embargo, no entiendo cómo funciona esto, posiblemente porque estoy pensando en ello como en una declaración if.

Si tengo un campo en la tabla user_role, por ejemplo, que contiene nombres como "Manager", "Part Time", etc., cómo puedo generar un campo role_order con un número diferente dependiendo del rol. En el caso de este ejemplo, "if user_role = 'Manager' then role_order = 5".

Tenga en cuenta que estoy buscando un enseñar a un hombre cómo pescar responder en lugar de dar a un hombre un pescado responder.

 61
Author: Sinister Beard, 2010-08-02

3 answers

CASE es más como una declaración de cambio. Tiene dos sintaxis que puedes usar. La primera le permite usar cualquier instrucción de comparación que desee:

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

El segundo estilo es para cuando solo se está examinando un valor, y es un poco más sucinto:

CASE user_role
    WHEN 'Manager' then 4
    WHEN 'Part Time' then 7
    ELSE -1 --unknown
END
 105
Author: RedFilter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-27 05:29:32

CASE en MySQL hay tanto una instrucción como una expresión , donde cada uso es ligeramente diferente.

Como una instrucción, CASE funciona como una instrucción switch y es útil en procedimientos almacenados, como se muestra en este ejemplo de la documentación (enlazado arriba):

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;
  |

Sin embargo, como expresión se puede usar en cláusulas:

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

Además, tanto como una declaración como una expresión, el primer argumento se puede omitir y cada WHEN debe toma una condición.

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

Proporcioné esta respuesta porque la otra respuesta no menciona que CASE puede funcionar tanto como una declaración como como una expresión. La principal diferencia entre ellos es que la forma de declaración termina con END CASE y la forma de expresión termina con solo END.

 12
Author: Svip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-02 16:57:44

Quería un ejemplo simple del uso de case con el que pudiera jugar, esto ni siquiera necesita una mesa. Esto devuelve impar o par dependiendo de si segundos es impar o par

SELECT CASE MOD(SECOND(NOW()),2) WHEN 0 THEN 'odd' WHEN 1 THEN 'even' END;
 0
Author: zzapper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-17 15:33:53