SQL CASE语句

SQL CASE语句

CASE 是一种类似于if-then-else的逻辑查询语句。当指定的条件评估为True时,该语句返回对应的值。当没有条件评估为True时,它返回ELSE部分的值。

当没有ELSE部分且没有条件评估为True时,它返回NULL值。

在结构化查询语言(SQL)中,CASE语句在SELECT、INSERT和DELETE语句中使用,有以下三个子句:

  1. WHERE子句
  2. ORDER BY子句
  3. GROUP BY子句

该语句在SQL中总是后跟至少一对WHEN和THEN语句,并以END关键字结束。

在关系数据库中,CASE语句有两种类型:

  1. 简单CASE语句
  2. 搜索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_FailedStudent_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

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程