MySQL CASE如何工作?

我知道SQL的CASE语法如下:

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

但是,我不明白这是如何工作的,可能是因为我正在考虑if是一个if语句。

如果我在表user_role有一个字段,例如包含“Manager”,“Part Time”等名称的字段,如何根据angular色生成具有不同编号的字段role_order 。 在这个例子中,“if user_role ='Manager'then role_order = 5”。

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

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 

MySQL中的CASE既是一个声明,也是一个expression式 ,每个用法都略有不同。

作为一个声明, 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; | 

然而,作为一个expression式,它可以用在从句中:

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

另外,既作为语句又作为expression式,第一个参数可以省略,每个WHEN必须有条件。

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

我提供了这个答案,因为另一个答案没有提到CASE可以同时作为一个语句和一个expression式。 它们之间的主要区别在于语句forms以END CASE结束,而expression式forms以END

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

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