There are two different types of CASE quires.
One is matching value and other one is matching condition.
First Type ( matching value )
MySQL Query Comparing with value, Syntax is here
CASE A_value
WHEN B_value THEN B_statement
[WHEN C_Value THEN C_statement] ...
[ELSE X_statement]
END CASE
MySQL case – when –then to match against value or condition with GROUP by and BETWEEN query
Here A_value is matched with different values given under WHEN. If A_value equals to B_value then B_statement is executed. If it is not matched than next WHEN value C_value is checked. If nothing is matched then statement under X_statement is executed.
If any WHEN statement is matched then rest WHEN statements are not checked and matched statement is returned.
Let us try one example
We will use our student table for this example.
We have allotted rooms for the classes at different floors in a school. Our list should display student details with class and location of the class. Using CASE in our query statement is here.
SELECT `id` , `name` , `class` , `mark` , `gender` ,
CASE class
WHEN 'four' THEN '1st floor'
WHEN 'five' THEN '2nd floor'
WHEN 'three' THEN '2nd floor'
WHEN 'two' THEN '1st floor'
ELSE 'Ground floor'
END AS location
FROM `student`
id
name
class
mark
gender
location
1
John Deo
Four
75
male
1st floor
2
Max Ruin
Three
85
male
2nd floor
3
Arnold
Three
55
male
2nd floor
4
Krish Star
Four
60
male
1st floor
5
John Mike
Four
60
male
1st floor
6
Alex John
Four
55
male
1st floor
7
My John Rob
Fifth
78
male
Ground floor
8
Asruid
Five
85
male
2nd floor
9
Tes Qry
Six
78
male
Ground floor
10
Big John
Four
55
male
1st floor
There are more records , here it is limited to 10 only.
We can display based on the floor wise or location wise by using order by query
SELECT `id` , `name` , `class` , `mark` , `gender` ,
CASE class
WHEN 'four' THEN '1st floor'
WHEN 'five' THEN '2nd floor'
WHEN 'three' THEN '2nd floor'
WHEN 'two' THEN '1st floor'
ELSE 'Ground floor'
END AS location
FROM `student` ORDER BY location
Second Type (Matching condition with CASE statement)
In this case we don't specify any value or data to be matched, instead we work on testing some conditions and if it is True then respective statement is to be executed.
CASE
WHEN condition_to_check THEN statement
[WHEN condition_to_check THEN statement ...
[ELSE statement]
END CASE
Here we check the condition and if it is True then the respective statement is executed.
Example :
We will try our student example. Here student grade is awarded based on the mark they got. Here is the query
SELECT `id` , `name` , `class` , `mark` , `gender` ,
CASE
WHEN mark >= 90 THEN 'A'
WHEN mark >= 80 THEN 'B'
WHEN mark >= 70 THEN 'C'
ELSE 'FAIL'
END AS grade
FROM `student`
SELECT `id` , `name` , `class` , `mark` , `gender` ,
CASE
WHEN mark BETWEEN 90 AND 100 THEN 'A'
WHEN mark BETWEEN 80 AND 89 THEN 'B'
WHEN mark BETWEEN 70 AND 79 THEN 'C'
ELSE 'FAIL'
END AS grade
FROM `student`
CASE with GROUP BY
We can further break the gender column to get number of male and female in each class by using SQL GROUP BY.
SELECT class, count(*) as Total,
sum(CASE WHEN gender ='male' THEN 1 ELSE 0 END) as Male,
sum(CASE WHEN gender ='Female' THEN 1 ELSE 0 END) as Female
FROM student group by class;
Output
class
Total
Male
Female
Eight
1
1
0
Five
3
3
0
Four
9
4
5
Nine
2
1
1
Seven
10
5
5
Six
7
2
5
Three
3
2
1
Using with NULL data
If any column has NULL data and we want to return 'checked' when it is not null and return 'not_checked' when it is NULL.
SELECT CASE WHEN c_name IS NOT NULL THEN 'checked'
ELSE 'not_checked'
END as my_status from STUDENT
Here c_name is the column name storing the status of the record, checked or not.