SQL CASE语句
CASE 是一种类似于if-then-else的逻辑查询语句。当指定的条件评估为True时,该语句返回对应的值。当没有条件评估为True时,它返回ELSE部分的值。
当没有ELSE部分且没有条件评估为True时,它返回NULL值。
在结构化查询语言(SQL)中,CASE语句在SELECT、INSERT和DELETE语句中使用,有以下三个子句:
- WHERE子句
- ORDER BY子句
- GROUP BY子句
该语句在SQL中总是后跟至少一对WHEN和THEN语句,并以END关键字结束。
在关系数据库中,CASE语句有两种类型:
- 简单CASE语句
- 搜索CASE语句
SQL CASE语句的语法
CASE
WHEN condition_1 THEN statement_1
WHEN condition_2 THEN statement_2 …….
WHEN condition_N THEN statement_N
ELSE result
END;
在这里,CASE语句逐个评估每个条件。
如果表达式与第一个WHEN子句的条件匹配,它将跳过所有后续的WHEN和THEN条件,并将结果返回为statement_1。
如果表达式与第一个WHEN条件不匹配,则将其与第二个WHEN条件进行比较。这个匹配过程将继续,直到表达式与任何WHEN条件匹配为止。
如果没有条件与表达式匹配,控制流会自动转到ELSE部分并返回其结果。在CASE语法中,ELSE部分是可选的。
在语法中,CASE和END是显示CASE语句开始和结束的最重要的关键字。
在SQL中的CASE语句示例
让我们来看看包含学生的学生详细信息表,其中包含学生的roll_no、name、marks、subject和city。
Roll_No | Stu_Name | Stu_Subject | Stu_Marks | Stu_City |
---|---|---|---|---|
2001 | Akshay | Science | 92 | Noida |
2002 | Ram | Math | 49 | Jaipur |
2004 | Shyam | English | 52 | Gurgaon |
2005 | Yatin | Hindi | 45 | Lucknow |
2006 | Manoj | Computer | 70 | Ghaziabad |
2007 | Sheetal | Math | 82 | Noida |
2008 | Parul | Science | 62 | Gurgaon |
2009 | Yogesh | English | 42 | Lucknow |
2010 | Ram | Computer | 88 | Delhi |
2011 | Shyam | Hindi | 35 | Kanpur |
示例 1: 下面的SQL语句使用单个WHEN和THEN条件来定义CASE语句:
SELECT Roll_No, Stu_Name, Stu_Subject, Stu_marks,
CASE
WHEN Stu_Marks >= 50 THEN 'Student_Passed'
ELSE 'Student_Failed'
END AS Student_Result
FROM Student_Details;
以上查询的解释:
在这里,CASE语句检查如果 Stu_Marks 大于等于50,它返回 Student_Passed 否则进入 ELSE 部分并返回 Student_Failed 在 Student_Result 列中。
输出:
Roll_No | Stu_Name | Stu_Subject | Stu_Marks | Student_Result |
---|---|---|---|---|
2001 | Akshay | Science | 92 | Student_Passed |
2002 | Ram | Math | 49 | Student_Failed |
2004 | Shyam | English | 52 | Student_Passed |
2005 | Yatin | Hindi | 45 | Student_Failed |
2006 | Manoj | Computer | 70 | Student_Passed |
2007 | Sheetal | Math | 82 | Student_Passed |
2008 | Parul | Science | 62 | Student_Passed |
2009 | Yogesh | English | 42 | Student_Failed |
2010 | Ram | Computer | 88 | Student_Passed |
2011 | Shyam | Hindi | 35 | Student_Failed |
示例2: 下面的SQL语句向CASE语句中添加了多个WHEN和THEN条件:
SELECT Roll_No, Stu_Name, Stu_Subject, Stu_marks,
CASE
WHEN Stu_Marks >= 90 THEN 'Outstanding'
WHEN Stu_Marks >= 80 AND Stu_Marks < 90 THEN 'Excellent'
WHEN Stu_Marks >= 70 AND Stu_Marks < 80 THEN 'Good'
WHEN Stu_Marks >= 60 AND Stu_Marks < 70 THEN 'Average'
WHEN Stu_Marks >= 50 AND Stu_Marks < 60 THEN 'Bad'
WHEN Stu_Marks < 50 THEN 'Failed'
END AS Stu_Remarks
FROM Student_Details;
上述查询的解释:
在这里,CASE语句逐个检查多个WHEN和THEN条件。如果 Stu_Marks 列的值大于或等于 90 ,则返回 Outstanding ,否则继续检查后续的WHEN和THEN条件。
如果 Student_Details 表中没有匹配的条件,CASE语句就会在 Stu_Remarks 列中返回 NULL 值,因为查询中没有ELSE部分。
输出结果:
Roll_No | Stu_Name | Stu_Subject | Stu_Marks | Stu_Remarks |
---|---|---|---|---|
2001 | Akshay | Science | 92 | Outstanding |
2002 | Ram Math | 49 | Failed | |
2004 | Shyam | English | 52 | Bad |
2005 | Yatin | Hindi | 45 | Failed |
2006 | Manoj | Computer | 70 | Good |
2007 | Sheetal | Math | 82 | Excellent |
2008 | Parul | Science | 62 | Average |
2009 | Yogesh | English | 42 | Failed |
2010 | Ram | Computer | 88 | Excellent |
2011 | Shyam | Hindi | 35 | Failed |
示例3:
让我们再来看一个包含Emp_ID、 Emp_Name、 Emp_Dept和Emp_Salary的Employee_Details表。
Emp_Id | Emp_Name | Emp_Dept | Emp_Salary |
---|---|---|---|
1 | Akshay | Finance | 9000 |
2 | Ram | Marketing | 4000 |
3 | Shyam | Sales | 5000 |
4 | Yatin | Coding | 4000 |
5 | Manoj | Marketing | 5000 |
1 | Akshay | Finance | 8000 |
2 | Ram | Coding | 6000 |
3 | Shyam | Coding | 4000 |
4 | Yatin | Marketing | 8000 |
5 | Manoj | Finance | 3000 |
以下SQL查询使用了GROUP BY子句和CASE语句:
SELECT Emp_Id, Emp_Name, Emp_Dept, sum(Emp_Salary) as Total_Salary,
CASE
WHEN SUM(Emp_Salary) >= 10000 THEN 'Increment'
ELSE 'Constant'
END AS Emp_Remarks
FROM Employee_Details
GROUP BY Emp_id, Emp_Name;
输出:
Emp_Id | Emp_Name | Emp_Dept | Total_Salary | Emp_Remarks |
---|---|---|---|---|
1 | Akshay | Finance | 17000 | Increment |
2 | Ram | Marketing | 9000 | Decrement |
3 | Shyam | Sales | 10000 | Increment |
4 | Yatin | Coding | 12000 | Increment |
5 | Manoj | Marketing | 8000 | Decrement |
示例4:在这个示例中,我们在SQL中使用ORDER BY语句和CASE语句:
让我们再看一个包含Emp_ID、Emp_Name、Emp_Dept和Emp_Age的Employee_Details表。
我们可以使用以下SQL查询来查看Employee_Details的数据:
Select * From Employee_Details;
输出:
Emp_Id | Emp_Name | Emp_Dept | Emp_Age |
---|---|---|---|
1 | Akshay | Finance | 23 |
2 | Ram | Marketing | 24 |
3 | Balram | Sales | 25 |
4 | Yatin | Coding | 22 |
5 | Manoj | Marketing | 23 |
6 | Sheetal | Finance | 24 |
7 | Parul | Finance | 22 |
8 | Yogesh | Coding | 25 |
9 | Naveen | Marketing | 22 |
10 | Tarun | Finance | 23 |
下面的SQL查询按照员工姓名的升序显示所有员工的详细信息:
SELECT * FROM Employee_Details
ORDER BY Emp_Name;
输出:
Emp_Id | Emp_Name | Emp_Dept | Emp_Age |
---|---|---|---|
1 | Akshay | Finance | 23 |
3 | Balram | Sales | 25 |
5 | Manoj | Marketing | 23 |
9 | Naveen | Marketing | 22 |
7 | Parul | Finance | 22 |
2 | Ram | Marketing | 24 |
6 | Sheetal | Finance | 24 |
10 | Tarun | Finance | 23 |
4 | Yatin | Coding | 22 |
8 | Yogesh | Coding | 25 |
如果您想在顶部显示那些在编码部门工作的员工,那么在这个操作中,您必须在CASE语句中使用单个WHEN和THEN语句,如下查询所示:
SELECT * FROM Employee_Details
ORDER BY CASE WHEN Emp_Dept = 'Coding' THEN 0
ELSE 1 END, Emp_Name;
输出:
Emp_Id | Emp_Name | Emp_Dept | Emp_Age |
---|---|---|---|
4 | Yatin | Coding | 22 |
8 | Yogesh | Coding | 25 |
1 | Akshay | Finance | 23 |
3 | Balram | Sales | 25 |
5 | Manoj | Marketing | 23 |
9 | Naveen | Marketing | 22 |
7 | Parul | Finance | 22 |
2 | Ram | Marketing | 24 |
6 | Sheetal | Finance | 24 |
10 | Tarun | Finance | 23 |