case的用法(二)(2)

来源:未知 责任编辑:责任编辑 发表时间:2015-09-17 09:42 点击:
THEN 'Matched'
ELSE 'Unmatched' END Label
FROM tbl_A;
--使用EXISTS的时候
SELECT keyCol,
CASE WHEN EXISTS ( SELECT * FROM tbl_B
WHERE tbl_A.keyCol = tbl_B.keyCol )
THEN 'Matched'
ELSE 'Unmatched' END Label
FROM tbl_A;  www.2cto.com  
 
使用IN和EXISTS的结果是相同的。也可以使用NOT IN和NOT EXISTS,但是这个时候要注意NULL的情况。
 
六,在Case函数中使用合计函数
 
假设有下面一个表
学号(std_id) 课程ID(class_id) 课程名(class_name) 主修flag(main_class_flg) 
100 1 经济学 Y 
100 2 历史学 N 
200 2 历史学 N 
200 3 考古学 Y 
200 4 计算机 N 
300 4 计算机 N 
400 5 化学 N 
500 6 数学 N
 
有的学生选择了同时修几门课程(100,200)也有的学生只选择了一门课程(300,400,500)。选修多门课程的学生,要选择一门课程作为主修,主修flag里面写入 Y。只选择一门课程的学生,主修flag为N(实际上要是写入Y的话,就没有下面的麻烦事了,为了举例子,还请多多包含)。 
现在我们要按照下面两个条件对这个表进行查询 
只选修一门课程的人,返回那门课程的ID 
选修多门课程的人,返回所选的主课程ID
 
简单的想法就是,执行两条不同的SQL语句进行查询。 
条件1
 
--条件1:只选择了一门课程的学生
SELECT std_id, MAX(class_id) AS main_class
FROM Studentclass
GROUP BY std_id
HAVING COUNT(*) = 1;
  www.2cto.com  
执行结果1
 
STD_ID    MAIN_class
------    ----------
300       4
400       5
500       6
 
条件2
 
--条件2:选择多门课程的学生
SELECT std_id, class_id AS main_class
FROM Studentclass
WHERE main_class_flg = 'Y' ;
 
执行结果2
 
STD_ID   MAIN_class
------   ----------
100      1
200      3
 
如果使用Case函数,我们只要一条SQL语句就可以解决问题,具体如下所示
 
SELECT   std_id,
CASE WHEN COUNT(*) = 1 --只选择一门课程的学生的情况
THEN MAX(class_id)  www.2cto.com  
ELSE MAX(CASE WHEN main_class_flg = 'Y'
THEN class_id
ELSE NULL END
)
END AS main_class
FROM Studentclass
GROUP BY std_id;
 
运行结果
 
STD_ID    MAIN_class
------    ----------
100       1
200       3
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • sql常见面试题
  • SQL SERVER 2005性能之跟踪
  • LINUX上RMAN自动备份脚本
  • sql server 列转行
  • SQL SERVER2008日常自动化备份
  • SQL Server 2005 镜像构建手册
  • SQL编程(一)
  • 如何将多个SQL查询统计结果一次显示出来
  • 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1