SQL语句中:简单Case函数和Case搜索函数
Case具有两种格式。
简单Case函数和Case搜索函数。
--简单Case函数
CASE sexWHEN '1' THEN '男'WHEN '2' THEN '女'
ELSE '其他' END
--Case搜索函数
CASE WHEN sex = '1' THEN '男'WHEN sex = '2' THEN '女'
ELSE '其他' END
这两种方式,可以实现相同的功能。简单Case
函数的写法相对比较简洁,但是和Case
搜索函数相比,功能方面会有些限制,比如写判断式。
还有一个需要注意的问题,Case
函数只返回第一个符合条件的值,剩下的Case
部分将会被自动忽略。
--比如说,下面这段SQL,你永远无法得到“第二类”这个结果
CASE WHEN col_1 IN ( 'a', 'b') THEN '第一类'WHEN col_1 IN ('a') THEN '第二类'
ELSE'其他' END
下面我们来看一下,使用Case
函数都能做些什么事情。
一,已知数据按照另外一种方式进行分组,分析。
有如下数据:(为了看得更清楚,我并没有使用国家代码,而是直接用国家名作为Primary Key
)
国家(country) 人口(population)
中国 600
美国 100
加拿大 100
英国 200
法国 300
日本 250
德国 200
墨西哥 50
印度 250
根据这个国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。
洲 人口
亚洲 1100
北美洲 250
其他 700
想要解决这个问题,你会怎么做?生成一个带有洲Code
的View
,是一个解决方法,但是这样很难动态的改变统计的方式。
如果使用Case
函数,SQL
代码如下:
SELECT SUM(population),CASE countryWHEN '中国' THEN '亚洲'WHEN '印度' THEN '亚洲'WHEN '日本' THEN '亚洲'WHEN '美国' THEN '北美洲'WHEN '加拿大' THEN '北美洲'WHEN '墨西哥' THEN '北美洲'ELSE '其他' END
FROM Table_A
GROUP BY CASE countryWHEN '中国' THEN '亚洲'WHEN '印度' THEN '亚洲'WHEN '日本' THEN '亚洲'WHEN '美国' THEN '北美洲'WHEN '加拿大' THEN '北美洲'WHEN '墨西哥' THEN '北美洲'ELSE '其他' END;
同样的,我们也可以用这个方法来判断工资的等级,并统计每一等级的人数。SQL
代码如下;
SELECTCASE WHEN salary <= 500 THEN '1'WHEN salary > 500 AND salary <= 600 THEN '2'WHEN salary > 600 AND salary <= 800 THEN '3'WHEN salary > 800 AND salary <= 1000 THEN '4'ELSE NULL END salary_class,COUNT(*)
FROM Table_A
GROUP BYCASE WHEN salary <= 500 THEN '1'WHEN salary > 500 AND salary <= 600 THEN '2'WHEN salary > 600 AND salary <= 800 THEN '3'WHEN salary > 800 AND salary <= 1000 THEN '4'ELSE NULL END;
二,用一个SQL语句完成不同条件的分组。
有如下数据
国家(country) 性别(sex) 人口(population)
中国 1 340
中国 2 260
美国 1 45
美国 2 55
加拿大 1 51
加拿大 2 49
英国 1 40
英国 2 60
按照国家和性别进行分组,得出结果如下
国家 男 女
中国 340 260
美国 45 55
加拿大 51 49
英国 40 60
普通情况下,用UNION
也可以实现用一条语句进行查询。但是那样增加消耗(两个Select
部分),而且SQL
语句会比较长。
下面是一个是用Case
函数来完成这个功能的例子
SELECT country,SUM( CASE WHEN sex = '1' THEN population ELSE 0 END), --男性人口SUM( CASE WHEN sex = '2' THEN population ELSE 0 END) --女性人口
FROM Table_A
GROUP BY country;
这样我们使用Select
,完成对二维表的输出形式,充分显示了Case
函数的强大。
三,在Check中使用Case函数。
在Check
中使用Case
函数在很多情况下都是非常不错的解决方法。可能有很多人根本就不用Check
,那么我建议你在看过下面的例子之后也尝试一下在SQL
中使用Check
。
下面我们来举个例子
公司A,这个公司有个规定,女职员的工资必须高于1000块。如果用Check和Case来表现的话,如下所示
CONSTRAINT check_salary CHECK( CASE WHEN sex = '2'THEN CASE WHEN salary > 1000THEN 1 ELSE 0 ENDELSE 1 END = 1 )
如果单纯使用Check,如下所示
CONSTRAINT check_salary CHECK( sex = '2' AND salary > 1000 )
女职员的条件倒是符合了,男职员就无法输入了。
Oracle CASE WHEN 用法介绍
1. CASE WHEN 表达式有两种形式
--简单Case函数
CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END --Case搜索函数 CASEWHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女' ELSE '其他' END
2. CASE WHEN 在语句中不同位置的用法
2.1 SELECT CASE WHEN 用法
SELECT grade, COUNT (CASE WHEN sex = 1 THEN 1 ELSE NULLEND) 男生数,COUNT (CASE WHEN sex = 2 THEN 1ELSE NULLEND) 女生数FROM students GROUP BY grade;
2.2 WHERE CASE WHEN 用法
SELECT T2.*, T1.*FROM T1, T2WHERE (CASE WHEN T2.COMPARE_TYPE = 'A' ANDT1.SOME_TYPE LIKE 'NOTHING%'THEN 1WHEN T2.COMPARE_TYPE != 'A' ANDT1.SOME_TYPE NOT LIKE 'NOTHING%'THEN 1ELSE 0END) = 1
2.3 GROUP BY CASE WHEN 用法
SELECT CASE WHEN salary <= 500 THEN '1' WHEN salary > 500 AND salary <= 600 THEN '2' WHEN salary > 600 AND salary <= 800 THEN '3' WHEN salary > 800 AND salary <= 1000 THEN '4' ELSE NULL END salary_class, -- 别名命名
COUNT(*) FROM Table_A GROUP BY CASE WHEN salary <= 500 THEN '1' WHEN salary > 500 AND salary <= 600 THEN '2' WHEN salary > 600 AND salary <= 800 THEN '3' WHEN salary > 800 AND salary <= 1000 THEN '4' ELSE NULL END;
3.关于IF-THEN-ELSE的其他实现
3.1 DECODE() 函数
select decode(sex, 'M', 'Male', 'F', 'Female', 'Unknown')
from employees;
貌似只有Oracle
提供该函数,而且不支持ANSI SQL
,语法上也没CASE WHEN
清晰,个人不推荐使用。
3.2 在WHERE中特殊实现
SELECT T2.*, T1.* FROM T1, T2
WHERE (T2.COMPARE_TYPE = 'A' AND T1.SOME_TYPE LIKE 'NOTHING%') OR (T2.COMPARE_TYPE != 'A' AND T1.SOME_TYPE NOT LIKE 'NOTHING%')
这种方法也是在特殊情况下使用,要多注意逻辑,不要弄错。
SQL语句中:简单Case函数和Case搜索函数相关推荐
- 关于sql语句中where条件内添加case when的问题
背景:数据库用的Oracle: 报表用的是[FineReport],之前没用过,被临时授命解决问题,所以大概了解了一下.里面应该是集成了excel插件,报表样式如下: 今天在项目中遇到一个这样的场景: ...
- oracle revers函数,Oracle SQL 语句中对Like的优化(引用reverse函数)
重点关注reverse 用法:reverse(字段)like reverse(属性值); 实际例子体现出得查询效率: select Max(Ana_Rqb_Date) from Ana_Rqb whe ...
- sql语句中case_SQL中的CASE语句
sql语句中case The case statement in SQL returns a value on a specified condition. We can use a Case sta ...
- 对SQL语句中case when...then...else...end的理解
最近在开发中遇到一个业务想了好久写了很多代码都解决不了,最后发现一句SQL语句就能完美解决了. 是这样的,商城中各商品都有对应的市场价marketprice,存在对应的数据表里shop_goods. ...
- sql语句中的case语句
sql语句中的case语句与高级语言中的switch语句,是标准sql的语法,适用于一个条件判断有多种值的情况下分别执行不同的操作. 首先,让我们看一下CASE的语法.在一般的SELECT中,其语法格 ...
- IsNull 和 SQL语句中CASE WHEN用法
[转]IsNull 和 SQL语句中CASE WHEN用法收藏 [转]IsNull 和 SQL语句中CASE WHEN用法 1.ISNULL 使用指定的替换值替换 NULL. ...
- SQL语句行列转换两种方法 case ...when 和pivot函数应用
2019独角兽企业重金招聘Python工程师标准>>> SQL语句行列转换两种方法 case ...when 和pivot函数应用SQL语句行列转换两种方法 case ...when ...
- SQL语句中的数学函数
SQL语句中的数学函数 开发工具与关键技术:SQL Server 2014.SQL语句中的数学函数 作者:袁何恩 撰写时间:2019年7月16日 今天,我要和大家分享的技术是SQL语句中的数学函数. ...
- sql语句中的函数使用
select *,sum(item_XXname) as itemSum from 表名. get(itemSum) 便可得到一系列的对应字段的和. 涉及到的其他的函数还有,摘自以下地址 http:/ ...
最新文章
- 线性布局上的一个小错误
- 深度学习目标检测模型全面综述:Faster R-CNN、R-FCN和SSD
- 原根与指标,离散对数
- the resource is not on the build path of a java project错误
- 为什么以前那种到处喝咖啡创业的场景一去不复返了?
- JDK源码分析(三)——HashMap 下(基于JDK8)
- 前端基础之CSS属性
- php 验证真实姓名,支付宝转账到支付宝 验证真实姓名
- 查看、删除本地电脑,连接过的共有文件夹(盘符) 「net use」
- English trip -- VC(情景课)2 C Where's my pencli?
- matlab中fplot和ezplot,Matlab中plot、fplot、ezplot的使用方法和区别
- C#实现10进制转2进制
- db9口rs485引脚接收和发送定义
- 动易2006CMSSP3+动网论坛 DVBBS 7.1 SP1+Oblog 3.13绿色整合版
- BottomNavigationView+ViewPager+Fragment 底部导航按钮
- 飞思卡尔MC9S12G64串口发送接收驱动
- google书签找回
- RE:从零开始的算法之路第六章
- java 第三方库common系统详解
- 1012: 8除不尽的数