百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

什么是 SQL CASE 表达式,如何使用 SQL CASE 表达式

ccwgpt 2024-11-27 12:19 17 浏览 0 评论

目录

  • 一、什么是 CASE 表达式
  • 二、CASE 表达式的语法
  • 三、CASE 表达式的使用方法
  • 四、CASE 表达式的书写位置

本文介绍 SQL CASE 表达式,它是 SQL 中数一数二的重要功能,CASE 表达式的语法分为简单 CASE 表达式搜索 CASE 表达式两种。

本文重点

CASE 表达式分为简单 CASE 表达式和搜索 CASE 表达式两种。搜索 CASE 表达式包含简单 CASE 表达式的全部功能。

虽然 CASE 表达式中的 ELSE 子句可以省略,但为了让 SQL 语句更加容易理解,还是希望大家不要省略。

CASE 表达式中的 END 不能省略。

使用 CASE 表达式能够将 SELECT 语句的结果进行组合。

虽然有些 DBMS 提供了各自特有的 CASE 表达式的简化函数,例如 Oracle 中的 DECODE 和 MySQL 中的 IF,等等,但由于它们并非通用的函数,功能上也有些限制,因此有些场合无法使用。

一、什么是 CASE 表达式

本文将要学习的 CASE 表达式,和“1 + 1”或者“120 / 4”这样的表达式一样,是一种进行运算的功能。这就意味着 CASE 表达式也是函数的一种。

它是 SQL 中数一数二的重要功能,希望大家能够在这里好好学习掌握。

CASE 表达式是在区分情况时使用的,这种情况的区分在编程中通常称为 (条件)分支 [1]。

二、CASE 表达式的语法

CASE 表达式的语法分为简单 CASE 表达式搜索 CASE 表达式两种。但是,由于搜索 CASE 表达式包含了简单 CASE 表达式的全部功能,因此本文只会介绍搜索 CASE 表达式。

想要了解简单 CASE 表达式语法的读者,可以参考本文末尾的“简单 CASE 表达式”专栏。

下面就让我们赶快来学习一下搜索 CASE 表达式的语法吧。

语法 16 搜索 CASE 表达式

CASE WHEN <求值表达式> THEN <表达式>     WHEN <求值表达式> THEN <表达式>     WHEN <求值表达式> THEN <表达式>       .       .       .     ELSE <表达式>END

WHEN 子句中的“<求值表达式>”就是类似“列 = 值”这样,返回值为真值(TRUE/FALSE/UNKNOWN)的表达式。

我们也可以将其看作使用 =!= 或者 LIKEBETWEEN 等 谓词 编写出来的表达式。

CASE 表达式会从对最初的 WHEN 子句中的“<求值表达式>”进行求值开始执行。

所谓求值,就是要调查该表达式的真值是什么。如果结果为真(TRUE),那么就返回 THEN 子句中的表达式,CASE 表达式的执行到此为止。

如果结果不为真,那么就跳转到下一条 WHEN 子句的求值之中。如果直到最后的 WHEN 子句为止返回结果都不为真,那么就会返回 ELSE 中的表达式,执行终止。

CASE 表达式名称中的“表达式”我们也能看出来,上述这些整体构成了一个表达式。并且由于表达式最终会返回一个值,因此 CASE 表达式在 SQL 语句执行时,也会转化为一个值。

虽然使用分支众多的 CASE 表达式编写几十行代码的情况也并不少见,但是无论多么庞大的 CASE 表达式,最后也只会返回类似“1”或者“'渡边先生'”这样简单的值。

三、CASE 表达式的使用方法

那么就让我们来学习一下 CASE 表达式的具体使用方法吧。

例如我们来考虑这样一种情况,现在 Product(商品)表中包含衣服、办公用品和厨房用具 3 种商品类型,请大家考虑一下怎样才能够得到如下结果。

A :衣服B :办公用品C :厨房用具

因为表中的记录并不包含“A :”或者“B :”这样的字符串,所以需要在 SQL 中进行添加。我们可以使用 SQL 常用的函数 中学过的字符串连接函数“||”来完成这项工作。

剩下的问题就是怎样正确地将“A :”“B :”“C :”与记录结合起来。这时就可以使用 CASE 表达式来实现了(代码清单 41)。

代码清单 41 通过 CASE 表达式将 A ~ C 的字符串加入到商品种类当中

SELECT product_name,       CASE WHEN product_type = '衣服'            THEN 'A:' || product_type            WHEN product_type = '办公用品'            THEN 'B:' || product_type            WHEN product_type = '厨房用具'            THEN 'C:' || product_type            ELSE NULL       END AS abc_product_type  FROM Product;

执行结果:

 product_name | abc_product_type--------------+------------------ T恤衫        | A :衣服 打孔器       | B :办公用品 运动T恤      | A :衣服 菜刀         | C :厨房用具 高压锅       | C :厨房用具 叉子         | C :厨房用具 擦菜板       | C :厨房用具 圆珠笔       | B :办公用品

6 行 CASE 表达式代码最后只相当于 1 列(abc_product_type)而已,大家也许有点吃惊吧!与商品种类(product_type)的名称相对应,CASE 表达式中包含了 3 条 WHEN 子句分支。

最后的 ELSE NULL 是“上述情况之外时返回 NULL”的意思。

ELSE 子句指定了应该如何处理不满足 WHEN 子句中的条件的记录,NULL 之外的其他值或者表达式也都可以写在 ELSE 子句之中。

但由于现在表中包含的商品种类只有 3 种,因此实际上有没有 ELSE 子句都是一样的。

ELSE 子句也可以省略不写,这时会被默认为 ELSE NULL。但为了防止有人漏读,还是希望大家能够显式地写出 ELSE 子句。

法则 3

虽然 CASE 表达式中的 ELSE 子句可以省略,但还是希望大家不要省略。

此外,CASE 表达式最后的“END”是不能省略的,请大家特别注意不要遗漏。忘记书写 END 会发生语法错误,这也是初学时最容易犯的错误。

法则 4

CASE 表达式中的 END 不能省略。

四、CASE 表达式的书写位置

CASE 表达式的便利之处就在于它是一个表达式。

之所以这么说,是因为表达式可以书写在任意位置,也就是像“1 + 1”这样写在什么位置都可以的意思。

例如,我们可以像下面这样利用 CASE 表达式将 SELECT 语句的结果中的行和列进行互换。

执行结果:

sum_price_clothes | sum_price_kitchen | sum_price_office------------------+-------------------+-----------------             5000 |             11180 |              600

上述结果是根据商品种类计算出的销售单价的合计值,通常我们将商品种类列作为 GROUP BY 子句的聚合键来使用,但是这样得到的结果会以“行”的形式输出,而无法以列的形式进行排列(代码清单 42)。

代码清单 42 通常使用 GROUP BY 也无法实现行列转换

SELECT product_type,       SUM(sale_price) AS sum_price  FROM Product GROUP BY product_type;

执行结果:

 product_type | sum_price--------------+---------- 衣服         |      5000 办公用品     |       600 厨房用具     |     11180

我们可以像代码清单 43 那样在 SUM 函数中使用 CASE 表达式来获得一个 3 列的结果。

代码清单 43 使用 CASE 表达式进行行列转换

-- 对按照商品种类计算出的销售单价合计值进行行列转换SELECT SUM(CASE WHEN product_type = '衣服'                THEN sale_price ELSE 0 END) AS sum_price_clothes,       SUM(CASE WHEN product_type = '厨房用具'                THEN sale_price ELSE 0 END) AS sum_price_kitchen,       SUM(CASE WHEN product_type = '办公用品'                THEN sale_price ELSE 0 END) AS sum_price_office  FROM Product;

在满足商品种类(product_type)为“衣服”或者“办公用品”等特定值时,上述 CASE 表达式输出该商品的销售单价(sale_price),不满足时输出 0

对该结果进行汇总处理,就能够得到特定商品种类的销售单价合计值了。

在对 SELECT 语句的结果进行编辑时,CASE 表达式能够发挥较大作用。

专栏

简单 CASE 表达式

CASE 表达式分为两种,一种是本文学习的“搜索 CASE 表达式”,另一种就是其简化形式——“简单 CASE 表达式”。

简单 CASE 表达式比搜索 CASE 表达式简单,但是会受到条件的约束,因此通常情况下都会使用搜索 CASE 表达式。在此我们简单介绍一下其语法结构。

简单 CASE 表达式的语法如下所示。

语法 A 简单 CASE 表达式

CASE <表达式> WHEN <表达式> THEN <表达式> WHEN <表达式> THEN <表达式> WHEN <表达式> THEN <表达式> . . . ELSE <表达式>END

与搜索 CASE 表达式一样,简单 CASE 表达式也是从最初的 WHEN 子句开始进行,逐一判断每个 WHEN 子句直到返回真值为止。

此外,没有能够返回真值的 WHEN 子句时,也会返回 ELSE 子句指定的表达式。两者的不同之处在于,简单 CASE 表达式最初的“CASE<表达式>”也会作为求值的对象。

下面就让我们来看一看搜索 CASE 表达式和简单 CASE 表达式是如何实现相同含义的 SQL 语句的。

将代码清单 41 中的搜索 CASE 表达式的 SQL 改写为简单 CASE 表达式,结果如下所示(代码清单 A)。

代码清单 A 使用 CASE 表达式将字符串 A ~ C 添加到商品种类中

-- 使用搜索CASE表达式的情况(重写代码清单6-41)SELECT product_name, CASE WHEN product_type = '衣服' THEN 'A :' | |product_type WHEN product_type = '办公用品' THEN 'B :' | |product_type WHEN product_type = '厨房用具' THEN 'C :' | |product_type ELSE NULL END AS abc_product_type FROM Product; -- 使用简单CASE表达式的情况SELECT product_name, CASE product_type WHEN '衣服' THEN 'A :' || product_type WHEN '办公用品' THEN 'B :' || product_type WHEN '厨房用具' THEN 'C :' || product_type ELSE NULL END AS abc_product_type FROM Product;

像“CASE product_type”这样,简单 CASE 表达式在将想要求值的表达式(这里是列)书写过一次之后,就无需在之后的 WHEN 子句中重复书写“product_type”了。

虽然看上去简化了书写,但是想要在 WHEN 子句中指定不同列时,简单 CASE 表达式就无能为力了。

专栏

特定的 CASE 表达式

由于 CASE 表达式是标准 SQL 所承认的功能,因此在任何 DBMS 中都可以执行。

但是,有些 DBMS 还提供了一些特有的 CASE 表达式的简化函数,例如 Oracle 中的 DECODE、MySQL 中的 IF 等。

使用 Oracle 中的 DECODE 和 MySQL 中的 IF 将字符串 A ~ C 添加到商品种类(product_type)中的 SQL 语句请参考代码清单 B。

代码清单 B 使用 CASE 表达式的特定语句将字符串 A ~ C 添加到商品种类中

Oracle

-- Oracle中使用DECODE代替CASE表达式SELECT product_name, DECODE(product_type, '衣服', 'A :' || product_type, '办公用品', 'B :' || product_type, '厨房用具', 'C :' || product_type, NULL) AS abc_product_typeFROM Product;

MySQL

-- MySQL中使用IF代替CASE表达式SELECT product_name, IF( IF( IF(product_type = '衣服', CONCAT('A :', product_type), NULL) IS NULL AND product_type = '办公用品', CONCAT('B :', product_type), IF(product_type = '衣服', CONCAT('A :', product_type), NULL)) IS NULL AND product_type = '厨房用具', CONCAT('C :', product_type), IF( IF(product_type = '衣服', CONCAT('A :', product_type), NULL) IS NULL AND product_type = '办公用品', CONCAT('B :', product_type), IF(product_type = '衣服', CONCAT('A :', product_type), NULL))) AS abc_product_typeFROM Product;

但上述函数只能在特定的 DBMS 中使用,并且能够使用的条件也没有 CASE 表达式那么丰富,因此并没有什么优势。希望大家尽量不要使用这些特定的 SQL 语句。

相关推荐

想快速上手Python网络爬虫?这份实战指南你不能错过!

以下是关于Python网络爬虫实战的详细指南,涵盖基础知识、常用工具、实战案例及注意事项:一、爬虫基础概念1.什么是网络爬虫?o通过自动化程序从网页上抓取并提取数据的工具。o核心步骤:请求网...

python爬虫怎么副业接单

其实这个问题也挺重要的,花了时间花了经历去学了python爬虫,本想靠着这个技能去补贴家用或者挣点零花钱,但是发现有时候的单子是自己力所不能及的,有的东西真的是不会,又或者不知从何下手。那么这篇文章主...

用Python写了一个图像文字识别OCR工具

人生苦短,快学Python!在之前的文章里,我们多次尝试用Python实现文本OCR识别!今天我们要搞一个升级版:直接写一个图像文字识别OCR工具!引言最近在技术交流群里聊到一个关于图像文字识别的...

taskPyro:为 Python 任务与爬虫插上自动化翅膀的开源利器

在数据驱动的时代,无论是数据采集、ETL流程,还是定期的系统维护脚本,高效、可靠的任务调度成为了许多开发者和运维人员的刚需。特别是对于Python开发者而言,如何优雅地管理和调度日益增多的爬虫任...

网络爬虫:Python动态网页爬虫2种技术方式及示例

作者:糖甜甜甜https://mp.weixin.qq.com/s/5Dwh5cbfjpDfm_FRcpw1Ug这一讲,我将会为大家讲解稍微复杂一点的爬虫,即动态网页的爬虫。动态网页技术介绍动态网页爬...

30个小时搞定Python网络爬虫(全套详细版)

【课程介绍】适用人群1、零基础对Python网络爬虫感兴趣的学员2、想从事Python网络爬虫工程师相关工作的学员3、想学习Python网络爬虫作为技术储备的学员课程目标1、本课程的目标是将大家培养成...

python爬虫常用工具库总结

说起爬虫,大家可能第一时间想到的是python,今天就简单为大家介绍下pyhton常用的一些库。请求库:实现基础Http操作urllib:python内置基本库,实现了一系列用于操作url的功能。...

玛森:Python爬虫书籍推荐

  Python爬虫书籍推荐什么?玛森科技徐老师介绍,网络爬虫现在很火,不管业内人士或业外人士,大家对爬虫或多或少都有一些了解,网络爬虫通俗的讲,就是通过程序去互联网上面爬取想要的内容,并且爬取的过程...

如何入门python爬虫?

1.很多人一上来就要爬虫,其实没有弄明白要用爬虫做什么,最后学完了却用不上。大多数人其实是不需要去学习爬虫的,因为工作所在的公司里有自己的数据库,里面就有数据来帮助你完成业务分析。什么时候要用到爬虫呢...

爬虫修炼手册,Python爬虫学习入门Scrapy

爬虫就如同江湖中的神秘侠客,应运而生,成为了我们获取数据的得力助手。爬虫,正式名称是网络爬虫(WebCrawler),也被叫做网页蜘蛛、网络机器人,它是一段神奇的计算机代码,能够自动在互联网的信息...

如何入门 Python 爬虫?

1.很多人一上来就要爬虫,其实没有弄明白要用爬虫做什么,最后学完了却用不上。大多数人其实是不需要去学习爬虫的,因为工作所在的公司里有自己的数据库,里面就有数据来帮助你完成业务分析。什么时候要用到爬虫呢...

有了这4张思维导图,带你Python(爬虫)轻松入门

刚接触Python爬虫,该怎么学更有效?指南君给大家带来了这四张思维导图。非常适合刚开始学Python爬虫的同学用于回顾知识点、巩固学习情况等。话不多说,快来学习Python爬虫入门的最强干货吧!P...

python爬虫教程之爬取当当网 Top 500 本五星好评书籍

我们使用requests和re来写一个爬虫作为一个爱看书的你(说的跟真的似的)怎么能发现好书呢?所以我们爬取当当网的前500本好五星评书籍怎么样?ok接下来就是学习python的正确姿...

超实用!Python 在爬虫和自动化领域的 8 类工具与技术大盘点

Python在爬虫和自动化领域拥有丰富的工具库和框架,以下是一些常用工具和技术的分类整理,帮助你高效实现数据抓取和自动化任务:1.基础HTTP请求库oRequestso简洁的HTTP库...

学习Python的第四天之网络爬虫

30岁程序员学习Python的第四天之网络爬虫的Scrapy库Scrapy库的基本信息Scrapy库的安装在windows系统中通过管理员权限打开cmd。运行pipinstallscrapy即可安...

取消回复欢迎 发表评论: