返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >SQLCASE表达式的具体使用
  • 452
分享到

SQLCASE表达式的具体使用

2024-04-02 19:04:59 452人浏览 八月长安
摘要

目录CASE 表达式里的聚合函数聚合与非聚合不能混用WHERE 中的 CASEGROUP BY 中的 CASEORDER BY 中的 CASE总结CASE 表达式分为简单表达

CASE 表达式分为简单表达式与搜索表达式,其中搜索表达式可以覆盖简单表达式的全部能力,我也建议只写搜索表达式,而不要写简单表达式。

简单表达式:

SELECT CASE city
WHEN '北京' THEN 1
WHEN '天津' THEN 2
ELSE 0
END AS abc
FROM test

搜索表达式:

SELECT CASE
WHEN city = '北京' THEN 1
WHEN city = '天津' THEN 2
ELSE 0
END AS abc
FROM test

明显可以看出,简单表达式只是搜索表达式 a = b 的特例,因为无法书写任何符号,只要条件换成 a > b 就无法胜任了,而搜索表达式不但可以轻松胜任,甚至可以写聚合函数。

CASE 表达式里的聚合函数

为什么 CASE 表达式里可以写聚合函数?

因为本身表达式就支持聚合函数,比如下面的语法,我们不会觉得奇怪:

SELECT sum(pv), avg(uv) from test

本身 sql 就支持多种不同的聚合方式同时计算,所以将其用在 CASE 表达式里,也是顺其自然的:

SELECT CASE
WHEN count(city) = 100 THEN 1
WHEN sum(dau) > 200 THEN 2
ELSE 0
END AS abc
FROM test

只要 SQL 表达式中存在聚合函数,那么整个表达式都聚合了,此时访问非聚合变量没有任何意义。所以上面的例子,即便在 CASE 表达式中使用了聚合,其实也不过是聚合了一次后,按照条件进行判断罢了。

这个特性可以解决很多实际问题,比如将一些复杂聚合判断条件的结果用 SQL 结构输出,那么很可能是下面这种写法:

SELECT CASE
WHEN 聚合函数(字段) 符合什么条件 THEN xxx
... 可能有 N 个
ELSE NULL
END AS abc
FROM test

这也可以认为是一种行转列的过程,即 把行聚合后的结果通过一条条 CASE 表达式形成一个个新的列

聚合与非聚合不能混用

我们希望利用 CASE 表达式找出那些 pv 大于平均值的行,以下这种想当然的写法是错误的:

SELECT CASE
WHEN pv > avg(pv) THEN 'yes'
ELSE 'no'
END AS abc
FROM test

原因是,只要 SQL 中存在聚合表达式,那么整条 SQL 就都是聚合的,所以返回的结果只有一条,而我们期望查询结果不聚合,只是判断条件用到了聚合结果,那么就要使用子查询。

为什么子查询可以解决问题?因为子查询的聚合发生在子查询,而不影响当前父查询,理解了这一点,就知道为什么下面的写法才是正确的了:

SELECT CASE
WHEN pv > ( SELECT avg(pv) from test ) THEN 'yes'
ELSE 'no'
END AS abc
FROM test

这个例子也说明了 CASE 表达式里可以使用子查询,因为子查询是先计算的,所以查询结果在哪儿都能用,CASE 表达式也不例外。

WHERE 中的 CASE

WHERE 后面也可以跟 CASE 表达式的,用来做一些需要特殊枚举处理的筛选。

比如下面的例子:

SELECT * FROM demo WHERE
CASE
WHEN city = '北京' THEN true
ELSE ID > 5
END

本来我们要查询 ID 大于 5 的数据,但我想对北京这个城市特别对待,那么就可以在判断条件中再进行 CASE 分支判断。

这个场景在 BI 工具里等价于,创建一个 CASE 表达式字段,可以拖入筛选条件生效。

GROUP BY 中的 CASE

想不到吧,GROUP BY 里都可以写 CASE 表达式:

SELECT isPower, sum(gdp) FROM test GROUP BY CASE
WHEN isPower = 1 THEN city, area
ELSE city
END

上面例子表示,计算 GDP 时,对于非常发达的城市,按照每个区粒度查看聚合结果,也就是看的粒度更细一些,而对于欠发达地区,本身 gdp 也不高,直接按照城市粒度看聚合结果。

这样,就按照不同的条件对数据进行了分组聚合。由于返回行结果是混在一起的,像这个例子,可以根据 isPower 字段是否为 1 判断,是否按照城市、区域进行了聚合,如果没有其他更显著的标识,可能导致无法区分不同行的聚合粒度,因此谨慎使用。

ORDER BY 中的 CASE

同样,ORDER BY 使用 CASE 表达式,会将排序结果按照 CASE 分类进行分组,每组按照自己的规则排序,比如:

SELECT * FROM test ORDER BY CASE
WHEN isPower = 1 THEN gdp
ELSE people
END

上面的例子,对发达地区采用 gdp 排序,否则采用人口数量排序。

总结

CASE 表达式总结一下有如下特点:

  • 支持简单与搜索两种写法,推荐搜索写法。
  • 支持聚合与子查询,需要注意不同情况的特点。
  • 可以写在 SQL 查询的几乎任何地方,只要是可以写字段的地方,基本上就可以替换为 CASE 表达式。
  • 除了 SELECT 外,CASE 表达式还广泛应用在 INSERT 与 UPDATE,其中 UPDATE 的妙用是不用将 SQL 拆分为多条,所以不用担心数据变更后对判断条件的二次影响。

到此这篇关于SQL CASE 表达式的具体使用的文章就介绍到这了,更多相关SQL CASE 表达式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SQLCASE表达式的具体使用

本文链接: https://lsjlt.com/news/143313.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SQLCASE表达式的具体使用
    目录CASE 表达式里的聚合函数聚合与非聚合不能混用WHERE 中的 CASEGROUP BY 中的 CASEORDER BY 中的 CASE总结CASE 表达式分为简单表达...
    99+
    2024-04-02
  • java中lambda表达式的分析与具体用法
    Lamda表达式 λ 希腊字母表中排序第十一位字母,英语名称为Lambda 避免匿名内部类定义过多 其实质属于函数式 编程的概念 (params)->expression[表...
    99+
    2024-04-02
  • PHP正则表达式preg_match的具体使用规则是怎样的
    这篇文章将为大家详细讲解有关PHP正则表达式preg_match的具体使用规则是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。PHP对于初学者来说,最难理解的内容要属于正则表达式的应用...
    99+
    2023-06-17
  • 正则表达式工具怎么使用
    使用正则表达式工具可以按照以下步骤进行:选择一个正则表达式工具:首先,你需要选择一个适合你需求的正则表达式工具。你可以选择在线工具,如Regex101、RegExr,或者使用文本编辑器插件,如Sublime Text、Visual Stud...
    99+
    2023-07-10
  • 【javaSE】 Lambda表达式与Lambda表达式的使用
    文章目录 🌳Lambda表达式的背景🚩Lambda表达式的语法🚩函数式接口 🎋Lambda表达式的基本使用🎄...
    99+
    2023-09-15
    开发语言 java Lambda表达式 源码
  • C#正则表达式双引号的具体作用是什么
    本篇内容主要讲解“C#正则表达式双引号的具体作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#正则表达式双引号的具体作用是什么”吧!C#正则表达式双引号、单引号的表示是什么?知道正则表...
    99+
    2023-06-18
  • 编译Python正则表达式的具体操作方法
    这期内容当中小编将会给大家带来有关编译Python正则表达式的具体操作方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。现在我们已经看了一些简单的正则表达式,那么我Python正则表达式在实际应用中如何使...
    99+
    2023-06-17
  • Quartz的cron表达式(定时器设置的具体表示的参数)
    一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。按顺序依次为秒(0~59)分钟(0~59)小时(0~23)天(月)(0~31,但是你需要考虑你月的天数)月(0~11)天(星期)(1~7 1=SUN 或 SUN,MON,TUE...
    99+
    2023-06-03
  • SpringBoot SpringEL表达式的使用
    目录一、SpringEL-基础介绍二、EL表达式-基础使用三、SpringEL-基础使用四、属性自动注入一、SpringEL-基础介绍 什么是SpringEL(SpEL)? ...
    99+
    2024-04-02
  • QueryWrapper的lambda表达式使用OR
    com.baomidou.mybatisplus.core.conditions.query.QueryWrapper是MybatisPlus框架构造查询条件常用的对象 使用lambda表达式写法更为清晰,简洁: QueryWrap...
    99+
    2023-08-31
    java mybatis Powered by 金山文档
  • bashshell逻辑表达式的使用
    目录前言test数字比较字符串比较文件比较、类型/属性检查逻辑与:-a,逻辑或:-o[命令[[ expression ]]前言 控制语句需要逻辑表达式进行分支判断,bash shel...
    99+
    2023-05-19
    shell逻辑表达式
  • python 正则表达式的使用
    目录1、正则表达式 1.1 正则表达式字符串1.1.1 元字符1.1.2 字符转义1.1.3 开始与结束字符1.2 字符类1.2.1 定义字符类1.2.2 字符串取反1.2.3 区间...
    99+
    2024-04-02
  • jmeter正则表达式的使用
    运用Jmeter正则提取器,可以从请求的响应结果中取到需要的内容,从而实现关联。 关联是请求与请求之间存在数据依赖关系,需要从上一个请求获取下一个请求需要回传回去的数据 在查看结果...
    99+
    2024-04-02
  • MariaDB表表达式之公用表表达式(CTE)
    目录前言1.非递归CTE2.递归CTE2.1 语法2.2 递归CTE示例(1)2.2 递归CTE示例(2)2.2 递归CTE示例(3)总结前言 公用表表达式(Common Table...
    99+
    2024-04-02
  • SQL 中 CASE 表达式的使用方式
    目录1. 前言2. 语法3. 注意点4. 分类汇总数据5. 一条SQL实现不同条件的统计6. 使用CHECK约束定义多个列的条件关系7. 在UPDATE语句中进行条件分支8. 生成交叉表9. CASE表达式中使用...
    99+
    2024-04-02
  • SQL中CASE表达式的使用方式
    目录1. 前言2. 语法3. 注意点4. 分类汇总数据5. 一条SQL实现不同条件的统计6. 使用CHECK约束定义多个列的条件关系7. 在UPDATE语句中进行条件分支8....
    99+
    2024-04-02
  • C#使用正则表达式
    一.正则基础 1. []方括号表示匹配可以匹配方括号中的任意点单个字符,方括号只允许匹配单个字符。2. | 或表示两项之间的一个选择,它不能和方括号使用,只能和小括号使用。3. ()...
    99+
    2024-04-02
  • Quartz表达式怎么使用
    Quartz表达式是一种时间表达式语言,用于配置Quartz调度器的任务调度时间。其基本语法为:[秒] [分钟] [小时] [日] ...
    99+
    2023-09-26
    Quartz
  • lambda表达式使用方法
    本篇内容介绍了“lambda表达式使用方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!package test;import java.u...
    99+
    2023-06-02
  • SQL正则表达式及mybatis中使用正则表达式的方法
    小编给大家分享一下SQL正则表达式及mybatis中使用正则表达式的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作