MySQL CASE如何工作?

时间:2010-08-02 16:29:15

标签: mysql case

我知道SQL的CASE语法如下:

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

但是,我不明白这是如何工作的,可能是因为我在考虑if声明。

例如,如果我在表user_role中有一个字段,其中包含“经理”,“兼职”等名称,那么如何生成具有不同数字的字段role_order关于这个角色。在本例中,“if user_role ='Manager',然后是role_order = 5”。

请注意我正在寻找教男人如何钓鱼答案,而不是给男人一个鱼答案。

3 个答案:

答案 0 :(得分:107)

CASE更像是一个switch语句。它有两种可以使用的语法。第一个允许您使用所需的任何比较语句:

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

第二种风格适用于您只检查一个值的情况,并且更简洁:

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

答案 1 :(得分:13)

MySQL中的

CASEstatementexpression,每种用法都略有不同。

作为一个声明,CASE的工作原理与switch语句非常相似,在存储过程中很有用,如本文中的示例所示(上面链接):

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

但是,作为表达式,它可以在子句中使用:

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

此外,作为语句和表达式,第一个参数可以省略,每个WHEN必须采用一个条件。

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

我提供了这个答案,因为另一个答案没有提到CASE既可以作为语句也可以作为表达式。它们之间的主要区别在于语句表单以END CASE结尾,表达式表单以END结尾。

答案 2 :(得分:1)

我想要一个可以使用的案例使用的简单示例,这甚至不需要表格。这将返回奇数或偶数,取决于秒是奇数还是偶数

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