SQL - CASE语句



SQL CASE 语句

SQL CASE 语句是一种条件语句,它可以帮助我们根据一组条件做出决策。它评估一组条件,并在满足条件时返回相应的值。

CASE 语句的工作原理类似于简化的 IF-THEN-ELSE 语句,并允许测试多个条件。

它以关键字 CASE 开头,后面跟着多个条件语句。每个条件语句至少包含一对 WHEN 和 THEN 语句。其中 WHEN 指定条件语句,THEN 指定要采取的操作。

它通常用于基于现有列的值创建具有新值的新列。

让我们看一个简单的场景来理解这个语句。

例如,当客户的信用额度超过“10,000”时,则该客户将被识别为“高价值客户”;当信用额度超过“5000”时,则该客户将被识别为“中等价值客户”;否则,该客户将被识别为“低价值客户”,如下表所示:

CASE

语法

以下是 SQL CASE 语句的语法:

CASE
   WHEN condition1 THEN statement1,
   WHEN condition2 THEN statement2,
   WHEN condition THEN statementN
   ELSE result
END;

其中,condition1, condition2, 等是条件语句,statement1, statement2, 等是在条件为真时要执行的操作。

满足条件后,CASE 语句将停止进一步验证,并返回结果。

  • 如果没有任何条件满足(TRUE),则返回ELSE子句中提到的值。

  • 如果未提及 ELSE 部分并且没有任何条件为 TRUE,则返回 NULL。

示例

假设我们创建了一个名为CUSTOMERS的表,其中包含客户的个人详细信息,包括他们的姓名、年龄、地址和薪水等,使用以下查询:

CREATE TABLE CUSTOMERS (
   ID INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY DECIMAL (18, 2),       
   PRIMARY KEY (ID)
); 

现在,使用 INSERT 语句将值插入此表,如下所示:

INSERT INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'Hyderabad', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );

该表将创建如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00

在以下查询中,我们对 CASE 语句使用多个 WHEN 和 THEN 条件以及 ELSE 子句。

如果客户的 AGE 大于 30,则返回 Gen X,否则转到进一步的 WHEN 和 THEN 条件。如果没有任何条件与 CUSTOMERS 表匹配,则 CASE 返回 ELSE 部分中提到的“Gen Alpha”值:

SELECT NAME, AGE,
CASE 
WHEN AGE > 30 THEN 'Gen X'
WHEN AGE > 25 THEN 'Gen Y'
WHEN AGE > 22 THEN 'Gen Z'
ELSE 'Gen Alpha' 
END AS Generation
FROM CUSTOMERS;

输出

产生的输出如下所示:

NAME AGE Generation
Ramesh 32 Gen X
Khilan 25 Gen Z
Kaushik 23 Gen Z
Chaitali 25 Gen Z
Hardik 27 Gen Y
Komal 22 Gen Alpha
Muffy 24 Gen Z

示例

让我们看看另一个查询,我们希望为之前创建的 CUSTOMERS 表中每个客户的金额小于 4500 的情况提供 25% 的加薪:

SELECT *, CASE 
WHEN SALARY < 4500 THEN (SALARY + SALARY * 25/100) 
END AS INCREMENT FROM CUSTOMERS;

输出

在这里,SQL 命令检查薪水是否小于 4500。如果满足此条件,则新列“INCREMENT”将包含等于薪水加 25% 增量的值。

由于上述查询中未提及 ELSE 部分,并且某些 CUSTOMERS 的条件均不为真,因此返回 NULL,这表明他们没有获得任何加薪。

ID NAME AGE ADDRESS SALARY INCREMENT
1 Ramesh 32 Ahmedabad 2000.00 2500.000000
2 Khilan 25 Delhi 1500.00 1875.000000
3 Kaushik 23 Kota 2000.00 2500.000000
4 Chaitali 25 Mumbai 6500.00 NULL
5 Hardik 27 Bhopal 8500.00 NULL
6 Komal 22 Hyderabad 4500.00 NULL
7 Muffy 24 Indore 10000.00 NULL

带有 ORDER BY 子句的 CASE 语句

我们可以将 CASE 语句与 ORDER BY 子句一起使用。SQL 中的 ORDER BY 子句按升序(默认)或降序对结果进行排序。

示例

在此查询中,CASE 语句用于根据“NAME”列的值按“NAME”列或“ADDRESS”列对结果进行排序。如果“NAME”列以“K”开头,则按“NAME”列对结果进行排序;否则,按“ADDRESS”列对结果进行排序:

SELECT * FROM CUSTOMERS
ORDER BY
(CASE
    WHEN NAME LIKE 'k%' THEN NAME
    ELSE ADDRESS
END);

输出

执行上述查询获得的结果如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
5 Hardik 27 Bhopal 8500.00
7 Muffy 24 Indore 10000.00
3 Kaushik 23 Kota 2000.00
2 Khilan 25 Delhi 1500.00
6 Komal 22 Hyderabad 4500.00
4 Chaitali 25 Mumbai 6500.00

带有 GROUP BY 子句的 CASE 语句

我们还可以将 CASE 语句与 GROUP BY 子句一起使用。SQL 中的 GROUP BY 子句将具有相同值的行的分组到一个或多个列中,其中应用聚合函数以生成汇总。

示例

在以下查询中,我们根据客户的薪水对客户进行分组,并计算指定客户数据范围内的薪水总和。

如果 SALARY 中的值小于或等于 4000,则数据将被分组为“最低薪”。如果该值大于 4000 且小于或等于 6500,则将其分组为“平均薪”。所有其他值将被分组为“最高薪”。SUM 函数用于计算每个组的 SALARY 总和:

SELECT 
   CASE 
      WHEN SALARY <= 4000 THEN 'Lowest paid'
      WHEN SALARY > 4000 AND SALARY <= 6500 THEN 'Average paid'
   ELSE 'Highest paid' 
      END AS SALARY_STATUS,
   SUM(SALARY) AS Total
   FROM CUSTOMERS
   GROUP BY 
   CASE 
      WHEN SALARY <= 4000 THEN 'Lowest paid'
      WHEN SALARY > 4000 AND SALARY <= 6500 THEN 'Average paid'
   ELSE 'Highest paid'
END;

输出

以下是上述查询的输出:

SALARY_STATUS Total
Lowest paid 5500.00
Average paid 11000.00
Highest paid 18500.00

带有 WHERE 子句的 CASE 语句

我们也可以将 CASE 语句与 WHERE 子句一起使用。WHERE 子句用于根据指定的条件筛选表中的行。

示例

在以下查询中,CASE 语句用于根据客户的 AGE 返回客户的不同职位。WHERE 子句用于根据客户的 SALARY 筛选行:

SELECT NAME, ADDRESS, 
   CASE 
      WHEN AGE < 25 THEN 'Intern'
      WHEN AGE >= 25 and AGE <= 27 THEN 'Associate Engineer'
      ELSE 'Senior Developer'
   END as Designation
FROM CUSTOMERS
WHERE SALARY >= 2000;

输出

上述查询的输出如下所示:

NAME ADDRESS Designation
Ramesh Ahmedabad Senior Developer
Kaushik Kota Intern
Chaitali Mumbai Associate Engineer
Hardik Bhopal Associate Engineer
Komal Hyderabad Intern
Muffy Indore Intern

带有 UPDATE 的 CASE 语句

我们可以在 UPDATE 语句中使用 CASE 语句对表中的数据执行条件更新。

示例

在以下查询中,我们根据客户的年龄更新所有客户的薪水。

如果客户的年龄等于“25”,则他们的薪水将更新为“17000”。如果年龄等于“32”,则将更新为“25000”。对于其他年龄的客户,薪水将更新为“12000”:

UPDATE CUSTOMERS
SET SALARY= 
CASE AGE
WHEN 25 THEN 17000
WHEN 32 THEN 25000
ELSE 12000
END;

输出

我们得到以下结果。我们可以观察到 7 行发生了更改:

Query OK, 7 rows affected (0.02 sec)
Rows matched: 7  Changed: 7  Warnings: 0

验证

我们可以使用以下查询更正对 CUSTOMERS 表所做的更改:

SELECT * FROM CUSTOMERS;

该表显示如下:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 25000.00
2 Khilan 25 Delhi 17000.00
3 Kaushik 23 Kota 12000.00
4 Chaitali 25 Mumbai 17000.00
5 Hardik 27 Bhopal 12000.00
6 Komal 22 Hyderabad 12000.00
7 Muffy 24 Indore 12000.00

如上表所示,所有客户的 SALARY 都已根据其年龄进行了更新。

带有 INSERT 的 CASE 语句

我们还可以借助 CASE 语句将数据插入 MySQL 表中。我们需要为数据插入提供带有列名和值的 INSERT INTO 语句。

示例

在这里,如果客户的年龄大于或等于 25,则薪水将为 23000;否则,薪水将为 14000:

INSERT INTO CUSTOMERS (ID, NAME, AGE, ADDRESS, SALARY)
VALUES (10, 'Viren', 28, 'Varanasi', 
   CASE 
      WHEN AGE >= 25 THEN 23000
      ELSE 14000
   END
);

输出

我们得到了以下结果。我们可以观察到更改发生在 1 行中 -

Query OK, 1 row affected (0.01 sec)

验证

我们可以使用以下查询更正对 CUSTOMERS 表所做的更改:

SELECT * FROM CUSTOMERS;

该表显示如下:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 Kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 Hyderabad 4500.00
7 Muffy 24 Indore 10000.00
10 Viren 28 Varanasi 23000.00
广告

© . All rights reserved.