一、前言
SQL 是用于访问和处理数据库的标准计算机语言。GaussDB 支持 SQL 标准(默认支持 SQL2、SQL3 和 SQL4 的主要特性)。
本系列将以《云数据库 GaussDB—SQL 参考》在线文档为主线进行介绍。
二、CASE Expression(CASE 表达式)介绍
在 GaussDB SQL 中,CASE 表达式(CASE Expression)是一个非常强大且常用的工具,可以用于在 SQL 中执行基于条件的操作。CASE 表达式类似于 IF-THEN-ELSE 语句,但使用起来更加灵活,易于阅读和编写。
CASE 表达式包含两种形式,一种是简单形式,一种是搜索形式。下面将分别介绍这两种形式的写法、语法以及使用方法。
三、GaussDB 数据库中的简单 CASE 表达式
1、基本概念
简单 CASE 表达式是指在给定的表达式上执行基于等式的比较,如果表达式等于某个值,则执行某个操作。即依据 input_expression 与 when_expression 的匹配结果跳转到相应的 result_expression。
2、基本语法
CASE input_expressionWHEN when_expression THEN result_expression[...n][ELSE else_result_expression]END;
说明:
其中,input_expression 表示需要比较的表达式,when_expression 等表示需要比较的值,result_expression 等表示各个值相等时的结果,else_result_expression 表示当 input_expression 不等于任何值时的默认结果
Tip:
CASE:简单 CASE 函数中支持子查询,但须注意 input_expression 与 when_expression 是可匹配的。 另外,如果没有取值为 TRUE 的 input_expression = when_expression,则当指定 ELSE 子句时,DLI 将返回 else_result_expression;当没有指定 ELSE 子句时,返回 NULL 值。
3、示例
假设根据固定的工资定义职员级别,可按如下 SQL 执行:
SELECT name,salary,CASE salaryWHEN 15000 THEN '初级'WHEN 20000 THEN '中级'WHEN 25000 THEN '高级'WHEN 30000 THEN '高级'WHEN 35000 THEN '高级'ELSE NULLEND AS levelFROM companyORDER BY salary;
SQL 语句解析:
测试使用的是在 GaussDB 数据库中创建的一张 company 表。
这段 SQL 是从 “company” 表中选择员工的名字(name)、薪水(salary)以及一个根据薪水等级分类的字段(level)。并使用 “ORDER BY salary” 语句将结果按照薪水从低到高的顺序进行排序。
简单 CASE 表达式的工作方式:
如果 “salary” 字段的值等于 15000,那么 “level” 字段的值就是 “初级”。
如果 “salary” 字段的值等于 20000,那么 “level” 字段的值就是 “中级”。
如果 “salary” 字段的值等于 25000 或 30000 或 35000,那么 “level” 字段的值都是 “高级”。
如果 “salary” 字段的值不等于以上任何值,那么 “level” 字段的值就是 NULL。
四、GaussDB 数据库中的搜索 CASE 表达式
1、基本概念
搜索 CASE 表达式是指在给定的表达式上执行基于不等式的比较,如果表达式满足给定的条件,则执行相应操作。即按指定顺序为每个 WHEN 子句的 boolean_expression 求值。返回第一个取值为 TRUE 的 boolean_expression 的 result_expression。
2、基本语法
CASE WHEN boolean_expression THEN result_expression[...n][ELSE else_result_expression]END;
说明:
其中,boolean_expression 等表示需要比较的条件,result_expression 等表示满足对应条件时的操作结果,else_result_expression 表示当 expression 不满足任何条件时的默认结果。
Tip:
boolean_expression:可以包含子查询,但整个 boolean_expression 表达式返回值只能是布尔类型。
如果没有取值为 TRUE 的 Boolean_expression,则当指定 ELSE 子句时,DLI 将返回 else_result_expression;当没有指定 ELSE 子句时,返回 NULL 值。
3、示例
假设根据工资的范围定义职员级别,可按如下 SQL 执行:
SELECT name,salary,CASE WHEN salary < 15000 THEN '初级'WHEN salary BETWEEN 15000 AND 25000 THEN '中级'WHEN salary >25000 THEN '高级'ELSE NULLEND AS levelFROM companyORDER BY salary;
SQL 语句解析:
这段 SQL 同上文,是从 "company" 表中选择员工的姓名(name)、薪水(salary)以及根据薪水等级进行分类(level)。
搜索 CASE 表达式的工作方式:
当薪水(salary)小于 15000 时,薪水等级被标记为 "初级"。
当薪水在 15000 和 25000 之间(包括 15000 和 25000)时,薪水等级被标记为 "中级"。
当薪水大于 25000 时,薪水等级被标记为 "高级"。
如果以上条件都不满足,薪水等级被标记为 NULL。
综上,这个 SQL 语句的主要目的是获取员工信息,根据其薪水水平对其进行分类,并按照薪水的水平进行排序。
五、小结
GaussDB 中的 CASE 表达式是一个非常有用的工具,可以用于在 SQL 中执行基于条件的操作,实现条件判断和分支逻辑,进一步优化数据库查询和操作。在编写 SQL 代码时,可以根据具体的业务需求灵活选择简单形式或搜索形式来进行编写,这样可以大大提高编码效率和代码可读性。
附:常见使用场景,如:二次定义标签、饱和度统计、计算指标、数据格式转换等。