如何在MySQL的CASE表达式中使用"OR"条件?

6

我有一个包含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语句的情况要么完全跳过,要么仅匹配列表中的第一项。我做错了什么?

2
我认为这个问题可以帮助你。https://dev59.com/iW035IYBdhLWcg3wVebn - Alfaplus
1
我们不能像这样使用IN查询,例如WHEN IN (1, 51, 100, 167)。 - sumit
3个回答

4
CASE ranking
  WHEN 1 THEN 'alpha' 
  WHEN 2 THEN 'beta'  
  WHEN 10 THEN 'charlie' 
  ELSE 'zelta' 
END CASE;

您可以使用 WHEN 子句中的一个表达式,但不能混合使用这两种表达式。
1) 使用 when_expression 这种简单的表达式进行比较,当使用简单 CASE 格式时。when_expression 可以是任何有效的表达式。input_expression 和每个 when_expression 的数据类型必须相同或必须进行隐式转换。
2) 使用 Boolean_expression 进行比较,当使用 searched 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

无论如何,你可以期望变量排序将在布尔表达式中进行比较。

http://msdn.microsoft.com/zh-cn/library/ms181765.aspx


1
如果您为您的意图添加说明,我认为这将对OP和其他访问者更有帮助。 - Reporter
感谢上面提供的有用链接。正如报告者所指出的那样,当前的答案既没有解释任何内容,也没有正确编码。如果您想赚取一些声望点,请尝试改进它。 - Question Overflow
更新了。谢谢你的建议。我是新手。 - Alfaplus
似乎上述内容适用于 Microsoft T-SQL 而不是 MySQL。尽管如此,我重新阅读了文档,并注意到它们的工作方式相同。主要的收获是第一个格式仅接受 _值_,而第二个格式接受一个 _搜索条件_,其中可能包括布尔型 "OR" 条件。 - Question Overflow

4

您可以使用"in"来比较数值或字符的值。

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

0
这也是可能的: select (case when (var1 = 0 or var2 = 1) then 'x' else 'y' end) from...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接