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

想要解决这个问题,你会怎么做?生成一个带有洲CodeView,是一个解决方法,但是这样很难动态的改变统计的方式。
如果使用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搜索函数相关推荐

  1. 关于sql语句中where条件内添加case when的问题

    背景:数据库用的Oracle: 报表用的是[FineReport],之前没用过,被临时授命解决问题,所以大概了解了一下.里面应该是集成了excel插件,报表样式如下: 今天在项目中遇到一个这样的场景: ...

  2. oracle revers函数,Oracle SQL 语句中对Like的优化(引用reverse函数)

    重点关注reverse 用法:reverse(字段)like reverse(属性值); 实际例子体现出得查询效率: select Max(Ana_Rqb_Date) from Ana_Rqb whe ...

  3. sql语句中case_SQL中的CASE语句

    sql语句中case The case statement in SQL returns a value on a specified condition. We can use a Case sta ...

  4. 对SQL语句中case when...then...else...end的理解

    最近在开发中遇到一个业务想了好久写了很多代码都解决不了,最后发现一句SQL语句就能完美解决了. 是这样的,商城中各商品都有对应的市场价marketprice,存在对应的数据表里shop_goods. ...

  5. sql语句中的case语句

    sql语句中的case语句与高级语言中的switch语句,是标准sql的语法,适用于一个条件判断有多种值的情况下分别执行不同的操作. 首先,让我们看一下CASE的语法.在一般的SELECT中,其语法格 ...

  6. IsNull 和 SQL语句中CASE WHEN用法

    [转]IsNull 和 SQL语句中CASE WHEN用法收藏   [转]IsNull 和 SQL语句中CASE WHEN用法 1.ISNULL     使用指定的替换值替换   NULL.      ...

  7. SQL语句行列转换两种方法 case ...when 和pivot函数应用

    2019独角兽企业重金招聘Python工程师标准>>> SQL语句行列转换两种方法 case ...when 和pivot函数应用SQL语句行列转换两种方法 case ...when ...

  8. SQL语句中的数学函数

    SQL语句中的数学函数 开发工具与关键技术:SQL Server 2014.SQL语句中的数学函数 作者:袁何恩 撰写时间:2019年7月16日 今天,我要和大家分享的技术是SQL语句中的数学函数. ...

  9. sql语句中的函数使用

    select *,sum(item_XXname) as itemSum from 表名. get(itemSum) 便可得到一系列的对应字段的和. 涉及到的其他的函数还有,摘自以下地址 http:/ ...

最新文章

  1. 线性布局上的一个小错误
  2. 深度学习目标检测模型全面综述:Faster R-CNN、R-FCN和SSD
  3. 原根与指标,离散对数
  4. the resource is not on the build path of a java project错误
  5. 为什么以前那种到处喝咖啡创业的场景一去不复返了?
  6. JDK源码分析(三)——HashMap 下(基于JDK8)
  7. 前端基础之CSS属性
  8. php 验证真实姓名,支付宝转账到支付宝 验证真实姓名
  9. 查看、删除本地电脑,连接过的共有文件夹(盘符) 「net use」
  10. English trip -- VC(情景课)2 C Where's my pencli?
  11. matlab中fplot和ezplot,Matlab中plot、fplot、ezplot的使用方法和区别
  12. C#实现10进制转2进制
  13. db9口rs485引脚接收和发送定义
  14. 动易2006CMSSP3+动网论坛 DVBBS 7.1 SP1+Oblog 3.13绿色整合版
  15. BottomNavigationView+ViewPager+Fragment 底部导航按钮
  16. 飞思卡尔MC9S12G64串口发送接收驱动
  17. google书签找回
  18. RE:从零开始的算法之路第六章
  19. java 第三方库common系统详解
  20. 1012: 8除不尽的数

热门文章

  1. keil5中出现 no browse info for symbol in this context怎么解决
  2. live-server
  3. 什么是序列化,为什么要序列化。
  4. 安装Origin提示your origin installation requires a license file to run,please……
  5. 多变量微积分笔记13——线积分
  6. 2.机器学习基础(二)
  7. 梅科尔工作室-郜翱翔-鸿蒙笔记1
  8. mybatis插入或更新语句返回自增逐渐id
  9. Unity实现物体逐渐消失
  10. AudioSampleProvider buffer overflow