Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does MySQL CASE work?

Tags:

mysql

case

I know that SQL's CASE syntax is as follows:

CASE     WHEN search_condition THEN statement_list     [WHEN search_condition THEN statement_list] ...     [ELSE statement_list] END CASE 

However, I don't understand how this works, possibly because I'm thinking about it as about an if statement.

If I have a field in table user_role, for example, which contains names like "Manager", "Part Time" etc., how do I generate a field role_order with a different number depending on the role. In the case of this example, "if user_role = 'Manager' then role_order = 5".

Please note I am looking for a teach a man how to fish answer rather than give a man a fish answer.

like image 625
JD Isaacks Avatar asked Aug 02 '10 16:08

JD Isaacks


People also ask

Does MySQL have CASE?

MySQL CASE is generally used when it is desired to evaluate the given column values against given conditions or return a custom value depending on the current column whose values are evaluated against a given condition.

How does a CASE statement work?

The CASE statement chooses from a sequence of conditions, and executes a corresponding statement. The CASE statement evaluates a single expression and compares it against several potential values, or evaluates multiple Boolean expressions and chooses the first one that is TRUE .

Can we use CASE statement in WHERE clause in MySQL?

Generally speaking, you can use the CASE expression anywhere that allows a valid expression e.g., SELECT , WHERE and ORDER BY clauses.

Why MySQL is not case-sensitive?

Table names are stored in lowercase on disk and name comparisons are not case-sensitive. MySQL converts all table names to lowercase on storage and lookup. This behavior also applies to database names and table aliases.


2 Answers

CASE is more like a switch statement. It has two syntaxes you can use. The first lets you use any compare statements you want:

CASE      WHEN user_role = 'Manager' then 4     WHEN user_name = 'Tom' then 27     WHEN columnA <> columnB then 99     ELSE -1 --unknown END 

The second style is for when you are only examining one value, and is a little more succinct:

CASE user_role     WHEN 'Manager' then 4     WHEN 'Part Time' then 7     ELSE -1 --unknown END 
like image 100
D'Arcy Rittich Avatar answered Oct 07 '22 21:10

D'Arcy Rittich


CASE in MySQL is both a statement and an expression, where each usage is slightly different.

As a statement, CASE works much like a switch statement and is useful in stored procedures, as shown in this example from the documentation (linked above):

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

However, as an expression it can be used in clauses:

SELECT *   FROM employees   ORDER BY     CASE title       WHEN "President" THEN 1       WHEN "Manager" THEN 2       ELSE 3     END, surname 

Additionally, both as a statement and as an expression, the first argument can be omitted and each WHEN must take a condition.

SELECT *   FROM employees   ORDER BY     CASE        WHEN title = "President" THEN 1       WHEN title = "Manager" THEN 2       ELSE 3     END, surname 

I provided this answer because the other answer fails to mention that CASE can function both as a statement and as an expression. The major difference between them is that the statement form ends with END CASE and the expression form ends with just END.

like image 38
Svip Avatar answered Oct 07 '22 22:10

Svip