Sql 简明教程

SQL - CASE

The SQL CASE Statement

SQL CASE 语句是一个条件语句,它帮助我们基于一组条件进行决策。它评估条件集,并在满足条件时返回各自的值。

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

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

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

例如,当客户的信用额度高于“10,000”时,则客户将被认为是“高价值客户”;当信用额度高于“5000”时,则客户将被认为是“中价值客户”;否则,客户将被认为是“低价值客户”,如下表所示:

case

Syntax

以下是 SQL CASE 语句的语法:

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

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

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

  1. 如果任何条件都不满足(TRUE),则返回 ELSE 条款中提到的值。

  2. 如果没有提到 ELSE 部分且任何条件都不是 TRUE,则返回 NULL。

Example

假设我们已使用以下查询创建了一个名为 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 条件。如果客户表中没有与查询 − 中 ELSE 部分提到的条件匹配,CASE 返回“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;

Output

输出结果如下:

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

Example

让我们看另一个查询,其中我们想要为每个客户提供 25% 的增量,如果金额小于先前创建的 CUSTOMERS 表中的 4500 −

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

Output

此处,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

CASE Statement with ORDER BY Clause

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

Example

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

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

Output

通过执行上述查询获得的结果如下所示 −

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

CASE Statement with GROUP BY Clause

我们还可以在 GROUP BY 子句中使用 CASE 语句。SQL 中的 GROUP BY 子句对一个或多个列中的值相同的行进行分组,并将聚合函数应用于这些行以生成汇总。

Example

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

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

Output

以下是以上查询的输出:

SALARY_STATUS

Total

Lowest paid

5500.00

Average paid

11000.00

Highest paid

18500.00

CASE Statement with WHERE Clause

我们还可以在 WHERE 子句中使用 CASE 语句。WHERE 子句用于根据指定条件筛选表中的行。

Example

在以下查询中,CASE 语句用于根据 CUSTOMERS 的 AGE 返回不同的名称。WHERE 子句用于根据 CUSTOMERS 的 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;

Output

以上查询的输出如下 −

NAME

ADDRESS

Designation

Ramesh

Ahmedabad

Senior Developer

Kaushik

Kota

Intern

Chaitali

Mumbai

Associate Engineer

Hardik

Bhopal

Associate Engineer

Komal

Hyderabad

Intern

Muffy

Indore

Intern

CASE Statement with UPDATE

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

Example

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

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

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

Output

我们得到以下结果。我们可以观察到,这些更改已在 7 行中完成 -

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

Verification

我们可以使用以下查询更正 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 已根据其年龄进行更新。

CASE Statement with INSERT

我们还可以借助 CASE 语句将数据插入 MySQL 表中。我们需要提供插入数据所用列名称和 VALUES 的 INSERT INTO 语句。

Example

在这里,如果客户的年龄大于或等于 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
);

Output

我们得到以下结果。我们可以观察到,已针对 1 行完成更改 -

Query OK, 1 row affected (0.01 sec)

Verification

我们可以使用以下查询更正 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