我有一个包含CASE表达式语句的过程,如下所示:
BEGIN
....
WHILE counter < total DO
....
CASE ranking
WHEN 1 OR 51 OR 100 OR 167 THEN SET
project_name = 'alpha';
WHEN 2 THEN SET
project_name = 'beta';
WHEN 10 OR 31 OR 40 OR 61 THEN SET
project_name = 'charlie';
....
ELSE SET
project_name = 'zelta';
END CASE;
INSERT INTO project (id, name) VALUES (LAST_INSERT_ID(), project_name);
SET counter = counter + 1;
END WHILE;
END
$$
DELIMITER ;
当我调用上述过程时,将完全跳过包含OR
语句的案例,或者只匹配列表中的第一项。我做错了什么?
答案 0 :(得分:3)
CASE ranking
WHEN 1 THEN 'alpha'
WHEN 2 THEN 'beta'
WHEN 10 THEN 'charlie'
ELSE 'zelta'
END CASE;
你可以使用WHEN有的表达之一,但你不能混合使用它们。
1)WH_ when_expression 是一个简单的表达式,当使用简单的CASE格式时,input_expression与之比较。 when_expression是任何有效的表达式。 input_expression和每个when_expression的数据类型必须相同或必须是隐式转换。
2)WHEN Boolean_expression 使用搜索的CASE格式时是否计算布尔表达式。 Boolean_expression是任何有效的布尔表达式。
你可以编程:
1)
CASE ProductLine
WHEN 'R' THEN 'Road'
WHEN 'M' THEN 'Mountain'
WHEN 'T' THEN 'Touring'
WHEN 'S' THEN 'Other sale items'
ELSE 'Not for sale'
2)
CASE
WHEN ListPrice = 0 THEN 'Mfg item - not for resale'
WHEN ListPrice < 50 THEN 'Under $50'
WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'
WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'
ELSE 'Over $1000'
END
但无论如何,您可以预期变量排名将在布尔表达式中进行比较。
答案 1 :(得分:1)
您可以使用来比较数字或字符值
CASE
WHEN ranking in(1,2,3) THEN '1Q'
WHEN ranking in(4,5,6) THEN '2Q'
ELSE '3Q'
END CASE;
CASE
WHEN ranking in('1','2','3') THEN '1Q'
WHEN ranking in('4','5','6') THEN '2Q'
ELSE '3Q'
END CASE;
这也将在select语句和存储过程中起作用。
select case when month(curdate()) in (4,5,6) then 1 when month(curdate()) in (7,8,9) then 2 else 3 end as fiscal_quarter ;