ORACLE里边case when then end的用法

来源:互联网 发布:sql美化工具 编辑:程序博客网 时间:2024/05/18 03:34

大家都知道Case when的用法,一旦满足了某一个WHEN ,则这一条数据就会退出CASE WHEN,而不再考虑其他CASE ,此文章来详细的介绍了case when的用法并举例说明了。

Case when 的用法
--简单Case函数 
简单CASE表达式,使用表达式确定返回值.
 代码如下
  CASE search_expression
  WHEN expression1 THEN result1
  WHEN expression2 THEN result2
  ...
  WHEN expressionN THEN resultN
  ELSE default_result
 
搜索CASE表达式,使用条件确定返回值.
  语法:
 
 代码如下
 CASE
  WHEN condition1 THEN result1
  WHEN condistion2 THEN result2
  ...
  WHEN condistionN THEN resultN
  ELSE default_result
  END
  例:
  select product_id,product_type_id,
  case
  when product_type_id=1 then 'Book'
  when product_type_id=2 then 'Video'
  when product_type_id=3 then 'DVD'
  when product_type_id=4 then 'CD'
  else 'Magazine'  www.2cto.com  
  end
  from products
 
这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。
还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
 实例演示:

  (1)查询表users中的数据。


  select u.id,u.realname,U.SEX from users u;


  查询结果如下


  ID    REALNAME SEX
  1  10082 松XX
  2  10084 林XX     1
  3  10087 西XX
  4  10100 胡XX
  5  10102 龙XX     1
  ......


  (2)上表结果中的"sex"是用代码表示的,希望将代码用中文表示。可在语句中使用CASE语句。

select u.id,u.realname,U.SEX,
  ( case u.sex
  when 1 then '男'
 
when 2 then '女'
  else '空的'
  END
  ) 性别
from users
u;

 查询结果

  ID    REALNAME SEX  性别
  1 10082 松XX         空的
  2 10084 林XX     1   男
  3 10087 西XX         空的
  4 10100 胡XX         空的
  5 10102 龙XX     1   男
  ......


  如果不希望列表中出现"sex"列,语句如下


select u.id,u.realname,
( case u.sex
when 1 then '男'
when 2 then
'女'
else '空的'
END
) 性别
from users u;

  (3)将sum与case结合使用,可以实现分段统计。

  例如现在我希望将上表中各种性别的人数进行统计,sql语句如下

select
sum( case u.sex when 1 then 1 else 0 end) 男性,
sum( case u.sex
when 2 then 1 else 0 end) 女性,
sum( case when u.sex<>1 and
u.sex<>2  then 1 else 0 end) 性别为空
from users
u;

  执行结果如下

  男性  女性  性别为空
  1 41    15   0

  如果学校内有数千名学生进行了考试,想统计60分以下、60-80分、80-100分的总人数,就可以使用这样的语句来实现。只是条件不同而已。

  (4)如果sum、case when结合group by使用,可以进行分组分段统计。

  如,我希望统计users表中每个创建者创建的男性、女性、无性别的用户总数(数据表中有一个字段creator_id,表示创建者的ID),语句如下

select u.creator_id 创建者ID,
sum( case u.sex when 1 then 1 else 0 end)
男性,
sum( case u.sex when 2 then 1 else 0 end) 女性,
sum( case when
u.sex<>1 and u.sex<>2  then 1 else 0 end) 性别为空
from users
u
group by u.creator_id;

  查询结果如下

  创建者ID 男性 女性 性别为空
  1          0    0   0
  2 10000    35   12  0
  3 11100    0    0   0
  4 11060    0    0   0
  5 11040    0    0   0
  6 11080    2    0   0
  7 10281    3    3   0
  8 10580    1    0   0


0 0