Case表达式 vs Case语句

46
在MySQL中,Case ExpressionCase Statement有什么区别?它们可以在什么时候使用?使用其中之一有什么好处?
Case Statement语法:
CASE
  WHEN search_condition THEN statement_list
  [WHEN search_condition THEN statement_list] ...
  [ELSE statement_list]
END CASE

Case Expression 语法:

CASE 
  WHEN [condition] THEN result 
  [WHEN [condition] THEN result ...] 
  [ELSE result] 
END

这两者看起来几乎相同,但是 Case Statements 的初始描述是“存储程序的 CASE 语句实现了一个复杂的条件结构”。那么,重要的区别是其中一个用于存储程序而不能在普通查询中使用吗?我在正在玩耍的查询上尝试了一下,但失败了-sqlfiddle。如果是这种情况,为什么不只在存储程序中使用 Case Expression 呢?还有其他需要注意的语法差异吗,因为它们似乎是相同的?
1个回答

70

CASE 表达式会计算出一个值,即根据某个条件从一组结果中计算出一个结果。


例如:

SELECT CASE
    WHEN type = 1 THEN 'foo'
    WHEN type = 2 THEN 'bar'
    ELSE 'baz'
END AS name_for_numeric_type
FROM sometable`

CASE语句基于某个条件执行一组语句。
例如:

CASE
    WHEN action = 'update' THEN
        UPDATE sometable SET column = value WHERE condition;
    WHEN action = 'create' THEN
        INSERT INTO sometable (column) VALUES (value);
END CASE

你可以看到它们是相似的,但是语句不能被计算出一个值并且可以单独使用,而表达式需要成为表达式的一部分,例如查询或赋值。你不能在查询中使用语句,因为查询不能包含语句,只能包含需要计算为某些内容的表达式(查询本身也是一种语句),例如SELECT CASE WHEN condition THEN UPDATE table SET something; END CASE是没有意义的。


很好的描述,我现在理解了它们之间的区别。我的唯一困惑是何时以及如何使用“Case语句”,使用您编写的语句创建一个PHP查询是否可行?并且我假设最好的方法是在设置变量作为另一个查询结果的查询之后使用它。例如:select @action:=action from table limit 1 然后查询 CASE WHEN @action = 'update' THEN UPDATE sometable SET column = value WHERE condition; 是否可行? - mrmryb
3
CASE语句只能在存储例程中使用,即在数据库中定义的过程和函数中。您不能在PHP脚本中将CASE语句作为查询执行。 - lanzz

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