MySQL CASE如何工作?

JD *_*cks 63 mysql case

我知道SQL的CASE语法如下:

CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE
Run Code Online (Sandbox Code Playgroud)

但是,我不明白这是如何工作的,可能是因为我把它当作一个if陈述.

user_role例如,如果我在表中有一个字段,其中包含"Manager","Part Time"等名称,那么如何role_order根据角色生成具有不同编号的字段.在此示例的情况下,"if user_role ='Manager',然后role_order = 5".

请注意我正在寻找一个教男人如何钓鱼回答而不是给男人一个鱼回答.

Red*_*ter 106

CASE更像是一个switch语句.它有两种可以使用的语法.第一个允许您使用所需的任何比较语句:

CASE 
    WHEN user_role = 'Manager' then 4
    WHEN user_name = 'Tom' then 27
    WHEN columnA <> columnB then 99
    ELSE -1 --unknown
END
Run Code Online (Sandbox Code Playgroud)

第二种方式是当你只检查一个值时,并且更简洁:

CASE user_role
    WHEN 'Manager' then 4
    WHEN 'Part Time' then 7
    ELSE -1 --unknown
END
Run Code Online (Sandbox Code Playgroud)

  • 我想通了,你应该以"END"而不是"END CASE"结束http://dev.mysql.com/doc/refman/5.0/en/case-statement.html谢谢! (7认同)

Svi*_*vip 13

CASE在MySQL中,它既是语句又是表达式,每种用法都略有不同.

作为一个语句,其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;
  |
Run Code Online (Sandbox Code Playgroud)

但是,作为表达式,它可以在子句中使用:

SELECT *
  FROM employees
  ORDER BY
    CASE title
      WHEN "President" THEN 1
      WHEN "Manager" THEN 2
      ELSE 3
    END, surname
Run Code Online (Sandbox Code Playgroud)

另外,作为语句和表达式,第一个参数可以省略,每个参数都WHEN必须采用一个条件.

SELECT *
  FROM employees
  ORDER BY
    CASE 
      WHEN title = "President" THEN 1
      WHEN title = "Manager" THEN 2
      ELSE 3
    END, surname
Run Code Online (Sandbox Code Playgroud)

我提供了这个答案,因为另一个答案没有提到CASE它既可以作为语句也可以作为表达式.它们之间的主要区别在于语句形式结束,END CASE表达形式以just结尾END.