文档章节

SQL case when 语句解析

zhangleimoth
 zhangleimoth
发布于 2016/03/09 02:37
字数 730
阅读 68
收藏 2

一,原始单表(也是从其他博客看到)及其查询后效果。

原始表:

查询后(要求查询后按照洲统计人口):

二,SQL探讨

*初始化insert语如下:

INSERT INTO cptable VALUES (NULL ,'中国',600);

INSERT INTO cptable VALUES (NULL ,'美国',100);

INSERT INTO cptable VALUES (NULL ,'加拿大',100);

INSERT INTO cptable VALUES (NULL ,'英国',200);

INSERT INTO cptable VALUES (NULL ,'法国',300);

INSERT INTO cptable VALUES (NULL ,'日本',250);

INSERT INTO cptable VALUES (NULL ,'德国',200);

INSERT INTO cptable VALUES (NULL ,'墨西哥',50);

INSERT INTO cptable VALUES (NULL ,'印度',250);

*SQL查询语句

表达方式A:

SELECT  SUM(population),
CASE country
WHEN '中国'     THEN '亚洲'
WHEN '印度'     THEN '亚洲'
WHEN '日本'     THEN '亚洲'
WHEN '美国'     THEN '北美洲'
WHEN '加拿大'  THEN '北美洲'
WHEN '墨西哥'  THEN '北美洲'
ELSE '其他' END
FROM    cptable
GROUP BY CASE country
WHEN '中国'     THEN '亚洲'
WHEN '印度'     THEN '亚洲'
WHEN '日本'     THEN '亚洲'
WHEN '美国'     THEN '北美洲'
WHEN '加拿大'  THEN '北美洲'
WHEN '墨西哥'  THEN '北美洲'
ELSE '其他' END;

表达方式B:

SELECT sum(population) AS population,
  (CASE
    WHEN country IN ('中国','日本','印度')THEN '亚洲'
    WHEN country IN ('加拿大','美国','墨西哥') THEN  '北美洲'
    else '其他' end) AS area
FROM cptable GROUP BY area;

        得出的结果都正确的,当我看到其他博客写的是表达方式A的时候,个人感觉特别繁琐,并不是说表达方式A中的多个when then 语句,而是 group by 前后都写了同样的SQL代码;让我们一起学习case when语句的方法,case when 语句其实就是在查询出来原始表后再做处理,添加新的列表,新增的列中的值以原始表列值为基础进行计算显示;

例如执行以下SQL:

SELECT cptable.country AS country,cptable.population AS population,
  (CASE
    WHEN country IN ('中国','日本','印度')THEN '亚洲'
    WHEN country IN ('加拿大','美国','墨西哥') THEN  '北美洲'
    else '其他' end) AS area
FROM cptable;

得到的结果如下:

        以上查询结果,一共有三列,分别为country,population, area。白色方框中的数据和原始表并无区别,而area这一列是自定义的,可以说是原始表结果的一个扩展信息。

        我们可以试着这样去理解,当数据库查询出原始数据第一行并想填充area这一列的时候发现该行country列为中国,根据自定义的when case语句 ,该行的area列只能填充‘亚洲’这个value;类似通过函数area = f(country,population),以数据表行为基础这一个维度,通过已有条件来设置新列的值,以此类推,数据库查询扫描第二行,根据自定义when case的规则得出结果area只能赋值‘北美洲’。。。。。。

我们查询显示时候,隐去不需要被看到的结果集如country列,然后group by area 通过area分组,SUM函数得到每组的总数,最后得出正确结果;



© 著作权归作者所有

zhangleimoth
粉丝 0
博文 1
码字总数 730
作品 0
杭州
程序员
私信 提问
swift sqlite 使用

导入 libsqlite3.0.tdb 创建 Header.h 并配置到 Object-C Bridging Header 在header.h中导入sqlite #import "SQLite3.h" 然后就可以使用 sqlite 数据库了 // // ViewController.swift // im......

asjoker
2016/01/11
168
0
基于Junit扩展的测试框架 - Baidu iTest

ITEST是面向主要的service接口诸如:HTTP,SOAP,JSON-RPC的轻量级自动化测试框架。将参数的输入、请求执行、结果解析、数据验证、数据准备与清理各个环节都做了封装,以数据文本文件为接口,...

匿名
2012/07/18
7.6K
0
【每日一摩斯】-Shared Pool优化和Library Cache Latch冲突优化 (1523934.1)-系列1

什么是Shared Pool? Oracle的实例主要包括共享内存(主要是SGA,还有PGA)和Background Processes,其中SGA中又包括了Shared Pool、Buffer Cache、Redo Log Buffer以及其它一些内存区。 Orac...

bisal
2013/08/28
0
0
T-SQL基础(一)之简单查询

名词解释 SQL: Structured Query Language,结构化查询语言,是一种在关系型数据库中用于管理数据的标准语言。SQL是一种声明式编程语言,即只需表明需要什么而无需关注实现细节(C#中的LINQ也...

雪飞鸿
2018/11/02
0
0
MyBatis binding 模块分析

MyBatis binding 模块分析 binding功能代码所在包 org.apache.ibatis.binding binding模块作用 封装ibatis编程模型ibatis编程模型中,SqlSession作为sql执行的入口,实用方法为sqlSession.sele...

红妍落日
10/22
33
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux 运行shell文件,出现 $'\r': command not found

运行编写的shell脚本时,出现了 $'\\r': command not found 这样的错误提示。 报错的原因是我们在windows系统操作时,编辑器里的换行符是\r\n ,而Linux上为\n,两个系统之间有差异导致的。 ...

芥末无敌
今天
7
0
Java数据结构(上)

枚举(Enumeration) 位集合(BitSet) 向量(Vector) 栈(Stack) 1.Enumeration(枚举) boolean hasMoreElements( ):测试是否有更多的元素 Object nextElement( ):如果此枚举对象至少还...

Firefly-
昨天
11
0
vue 跨层组件通讯 provide inject

https://cn.vuejs.org/v2/api/#provide-inject 类型: provide:Object | () => Object inject:Array<string> | { [key: string]: string | Symbol | Object } 详细: provide 和 inject 主......

阿豪boy
昨天
7
0
黑马程序员面试宝典(Java)Beta6.0免费下载

场景 JavaSE基础 面向对象特征以及理解 访问权限修饰符区别 理解clone对象 JavaSE语法 java有没有goto语句 &和&&的区别 如何跳出当前的多重嵌套循环? 是否可以继承String? 重载与重写的区别...

badaoliumang
昨天
9
0
监控linux系统状态

查看系统负载: w/uptime 最后面三个数字表示1分钟,5分钟,15分钟平均有多少个进程占用CPU 占用CPU的进程可以是Running,也可以是Waiting 某一时刻1颗CPU只能有一个进程在使用其资源 #查看c...

asnfuy
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部