2.1 CASE语句

在 SQL 中有两种写语句的方法CASE。第一个条目让它看起来像是从 Java 语言切换过来的,而第二个格式更像是 plural if-else

让我们从第一个选项开始——开关的模拟。一般格式为:

CASE case_value
	WHEN value1 THEN result1
	[WHEN value2 THEN result2] ...
	[ELSE resultN]
END

真的很像switch,只是用词略有不同:

数据库 爪哇
案例 x 开关(x){
当值 案例价值:
然后结果 返回结果;
否则结果 默认:返回结果;
结尾 }

让我们将一个例子从 Java 翻译成 SQL:

爪哇 数据库
switch (a) {
   case 1: return "one";
   case 2: return "two";
   case 3: return "three";
   default: return "unknown";
}
CASE a
   WHEN 1 THEN 'one'
   WHEN 2 THEN 'two'
   WHEN 3 THEN 'three'
   ELSE 'unknown'
END

2.2 CASE语句的第二个版本

还有第二个版本的 operator CASE,如上所述,它更像 plural if-else。一般格式为:

CASE
	WHEN condition 1 THEN result1
	[WHEN condition 2 THEN result2] ...
	[ELSE resultN]
END

这里只是简单的顺序检查条件,如果有一个为真,则返回指定的结果。如果所有条件都不为真,则在 中指定的值ELSE

让我们将一个例子从 Java 翻译成 SQL:

爪哇 数据库
if (a == 3)
	return "three";
CASE
   WHEN a=3 THEN 'three'
END
if (a == 3)
	return "three";
else
	return "zero";
CASE
   WHEN a=3 THEN 'three'
   ELSE 'zero'
END
if (a == 1)
	return "three";
else if (a == 2)
	return "two";
else if (a == 3)
	return "three";
else
	return "zero";
CASE
   WHEN a=1 THEN 'one'
   WHEN a=2 THEN 'two'
   WHEN a=3 THEN 'three'
   ELSE 'zero'
END

2.3 使用CASE语句解决问题

让我们写下一些有趣的查询。请记住,我们有一个任务 - 添加“过期!”这个词。以任务表中过去的任务名称。它可以很容易地用CASE.

对于截止日期字段,它看起来像声明的第二个版本CASE


CASE
	WHEN deadline < CURDATE() THEN CONCAT('EXPIRED!', name)
	ELSE name
END
        

使用运算符的完整查询示例CASE


SELECT
    id,
    emploee_id,
    CASE WHEN deadline < CURDATE() THEN CONCAT('EXPIRED!', name) ELSE name END AS name,
    deadline         	
FROM task
        

此查询的结果将是:

ID emploee_id 姓名 最后期限
1个 1个 已到期!修复一个前端bug 2022-06-01
2个 2个 修复后端的一个bug 2022-06-15
3个 5个 买咖啡 2022-07-01
4个 5个 买咖啡 2022-08-01
5个 5个 买咖啡 2022-09-01
6个 (无效的) 打扫办公室 (无效的)
7 4个 享受生活 (无效的)
8个 6个 享受生活 (无效的)