我知道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”。
请注意我正在寻找教男人如何钓鱼答案,而不是给男人一个鱼答案。
答案 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)
CASE
是statement和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;
|
但是,作为表达式,它可以在子句中使用:
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;