事情董文标马明哲处境不妙打三个数字?

Case具有两种格式。简单Case函数和Case搜索函数。
简单Case函数
WHEN&'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)
根据这个国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。
&&&解决这个问题,你会怎么做?生成一个带有洲Code的View是一个解决方法,但是这样很难动态的改变统计的方式。如果使用Case函数,SQL代码如下:
SELECT&&SUM(population),&
CASE&country&&WHEN&'中国'&THEN&'亚洲'&
&&WHEN&'印度'&THEN&'亚洲'&
&&WHEN&'日本'&THEN&'亚洲'&
&&WHEN&'美国'&THEN&'北美洲'&
&&WHEN&'加拿大'&&THEN&'北美洲'&
&&WHEN&'墨西哥'&&THEN&'北美洲'&
ELSE&'其他'&END&
FROM&&&&Table_A&
CASE&country&
WHEN&'中国'&THEN&'亚洲'&
WHEN&'印度'&THEN&'亚洲'
WHEN&'日本'&THEN&'亚洲'&
WHEN&'美国'&THEN&'北美洲'&
WHEN&'加拿大'&&&THEN&'北美洲'&
WHEN&'墨西哥'&&&THEN&'北美洲'&
ELSE&'其他'&END;&
同样的,我们也可以用这个方法来判断工资的等级,并统计每一等级的人数。SQL代码如下:
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&
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;&
二,用一个SQL语句完成不同条件的分组。
有如下数据
按照国家和性别进行分组,得出结果如下
&&&普通情况下,用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&&
这样我们使用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 & 1000&THEN1&ELSE&0&END&ELSE&1&END&= 1 )
如果单纯使用Check:&CONSTRAINT&check_salary&CHECK&( sex =&'2'&AND&salary & 1000 ) 女职员的条件倒是符合了,男职员就无法输入了。
四,根据条件有选择的UPDATE。
例,有如下更新条件
1.工资5000以上的职员,工资减少10%
2.工资在之间的职员,工资增加15%
很容易考虑的是选择执行两次UPDATE语句,如下所示
UPDATE&Personnel&&SET&salary
= salary * 0.9&&WHERE&salary &= 5000;&
UPDATE&Personnel&&SET&salary
= salary * 1.15&
WHERE&salary &= 2000&AND&salary
但是事情没有想象得那么简单,假设有个人工资5000块。首先,按照条件1,工资减少10%,变成工资4500。接下来运行第二个SQL时候,因为这个人的工资是到4600的范围之内,需增加15%,最后这个人的工资结果是5175,不但没有减少,反而增加了。如果要是反过来执行,那么工资4600的人相反会变成减少工资。暂且不管这个规章是多么荒诞,如果想要一个SQL 语句实现这个功能的话,我们需要用到Case函数。代码如下:
UPDATE&Personnel
SET&salary =
CASE&WHEN&salary &= 5000&& &&&&&&&&&&&&&&&&THEN&salary
&&&&&WHEN&salary &= 2000&AND&salary
& 4600&&THEN&salary * 1.15&
ELSE&salary&END;&
这里要注意一点,最后一行的ELSE salary是必需的,要是没有这行,不符合这两个条件的人的工资将会被写成NUll,那可就大事不妙了。在Case函数中Else部分的默认值是NULL,这点是需要注意的地方。
这种方法还可以在很多地方使用,比如说变更主键这种累活。
一般情况下,要想把两条数据的Primary key,a和b交换,需要经过临时存储,拷贝,读回数据的三个过程,要是使用Case函数的话,一切都变得简单多了。
假设有如上数据,需要把主键a和b相互交换。用Case函数来实现的话,代码如下
UPDATE&SomeTable&
SET&p_key =&CASE&WHEN&p_key
=&'a'&&THEN&'b'&
WHEN&p_key =&'b'&&THEN&'a'&&ELSE&p_key&END&
WHERE&p_key&IN&('a',&'b');&
同样的也可以交换两个Unique key。需要注意的是,如果有需要交换主键的情况发生,多半是当初对这个表的设计进行得不够到位,建议检查表的设计是否妥当。
五,两个表数据是否一致的检查。
Case函数不同于DECODE函数。在Case函数中,可以使用BETWEEN,LIKE,IS NULL,IN,EXISTS等等。比如说使用IN,EXISTS,可以进行子查询,从而 实现更多的功能。
下面具个例子来说明,有两个表,tbl_A,tbl_B,两个表中都有keyCol列。现在我们对两个表进行比较,tbl_A中的keyCol列的数据如果在tbl_B的keyCol列的数据中可以找到,返回结果'Matched',如果没有找到,返回结果'Unmatched'。
要实现下面这个功能,可以使用下面两条语句
--使用IN的时候&
SELECT&keyCol,&
CASE&WHEN&keyCol&IN&(&SELECT&keyCol&FROM&tbl_B
)&&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;&
使用IN和EXISTS的结果是相同的。也可以使用NOT IN和NOT EXISTS,但是这个时候要注意NULL的情况。
六,在Case函数中使用合计函数
假设有下面一个表
学号(std_id)
课程ID(class_id)
课程名(class_name)
主修flag(main_class_flg)
&&&有的学生选择了同时修几门课程(100,200)也有的学生只选择了一门课程(300,400,500)。选修多门课程的学生,要选择一门课程作为主修,主修flag里面写入 Y。只选择一门课程的学生,主修flag为N(实际上要是写入Y的话,就没有下面的麻烦事了,为了举例子,还请多多包含)。
现在我们要按照下面两个条件对这个表进行查询
1.只选修一门课程的人,返回那门课程的ID
2.选修多门课程的人,返回所选的主课程ID
简单的想法就是,执行两条不同的SQL语句进行查询。
--条件1:只选择了一门课程的学生&
SELECT&std_id, MAX(class_id)&AS&main_class&&FROM&Studentclass&&GROUP&BY&std_id&&HAVINGCOUNT(*)
STD_ID&&&MAIN_class&&
300&&&&&&4&
400&&&&&&5&
500&&&&&&6&
--条件2:选择多门课程的学生&&SELECT&std_id,
class_id&AS&main_class&&FROM&Studentclass&WHERE&main_class_flg
STD_ID&&MAIN_class&&&
100&&&&&1&
200&&&&&3&
如果使用Case函数,我们只要一条SQL语句就可以解决问题,具体如下所示
SELECT&&std_id,&
WHEN&COUNT(*) = 1&&--只选择一门课程的学生的情况&&THEN&MAX(class_id)&
MAX(CASE&WHEN&main_class_flg
=&'Y'&&THEN&class_id&&ELSE&NULL&END&&)&
END&AS&main_class&
FROM&Studentclass&&GROUP&BY&std_&
STD_ID&&&MAIN_class&
100&&&&&&1&
200&&&&&&3&
300&&&&&&4&
400&&&&&&5&
500&&&&&&6&
通过在Case函数中嵌套Case函数,在合计函数中使用Case函数等方法,我们可以轻松的解决这个问题。使用Case函数给我们带来了更大的自由度。
最后提醒一下使用Case函数的新手注意不要犯下面的错误
CASE&col_1&
WHEN&&1&&&&THEN&'Right'&
WHEN&&NULL&THEN&'Wrong'&
在这个语句中When Null这一行总是返回unknown,所以永远不会出现Wrong的情况。因为这句实际表达的意思是
WHEN col_1 = NULL,这是一个错误的用法,这个时候我们应该选择用WHEN col_1 IS NULL。&
&&&select 与 case结合使用最大的好处有两点,一是在显示查询结果时可以灵活的组织格式,二是有效避免了多次对同一个表或几个表的访问。
下面举个简单的例子来说明。例如表 students(id, name ,birthday, sex, grade),要求按每个年级统计男生和女生的数量各是多少,统计结果的表头为,年级,男生数量,女生数量。如果不用select case when,为了将男女数量并列显示,统计起来非常麻烦,先确定年级信息,再根据年级取男生数和女生数,而且很容易出错。
用select case when写法如下:
SELECT&grade,&COUNT&(CASE WHEN sex = 1&THEN 1&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&ELSE NULL
&&&&&&&&&&&&&&&&&&&&&&&&END) 男生数,
&&&&&&&&&&&&&&&COUNT&(CASE WHEN sex = 2&THEN
&&&&&&&&&&&&&&&&&&&&&&&&&&&&ELSE NULL
&&&&&&&&&&&&&&&&&&&&&&&END) 女生数
FROM students
SUM函数,是SQL中用来累加的一个函数,SUM(1)这种带数字参数的函数意思是,数据库表中所有的列数*函数中的参数,
如:SELECT * FROM TEST 结果为10,
则SELECT SUM(1) FROM TEST 结果为10,SELECT SUM(2) FROM TEST 结果为20
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1276次
排名:千里之外
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'证券时报网络版郑重声明
经证券时报社授权,证券时报网独家全权代理《证券时报》信息登载业务。本页内容未经书面授权许可,不得转载、复制或在非证券时报网所属服务器建立镜像。欲咨询授权事宜请与证券时报网联系 (7) 。
美就业数据不妙 QE3预期重燃 伯南克和联储官员本周将作系列演讲,投资者希望从中寻找QE3蛛丝马迹
来源:证券时报网 作者:吴家明
&&证券时报记者 吴家明&&美联储对第三轮量化宽松政策(QE3)的支持度下降给金融市场突然一击,上周道指以及标普500指数均创下自今年以来的最差单周表现。不过,上周出炉的就业数据让市场大跌眼镜,又再度勾起了市场对QE3的期待。本周,美联储主席伯南克和众多联储官员将展开一系列演讲,伯南克将如何编排这场大戏,市场屏息以待。&&失业率成心头痛&&一直以来,就业市场是美联储最为关注的领域。上周公布的美联储会议纪要也指出,近期美国经济出现增强迹象,但仍重点关注居高不下的失业率。与此同时,美联储内部仍对就业市场复苏持分化态度。&&美国劳工部上周五公布的数据显示,美国3月份失业率下降至8.2%,这是美国失业率连续9个月没有出现上升的现象,但非农业部门新增就业岗位仅12万个,大大低于此前市场普遍预期的约20万个,创下近5个月以来的最低纪录。&&据悉,失业率下降的主因是越来越多失业者放弃寻找工作,而放弃的原因与美国企业雇人步伐放慢有关。根据官方统计惯例,放弃就业者不被纳入失业统计中。美国总统奥巴马警告称,美国就业状况仍起起落落,政府还要完成许多任务以改善状况。&&QE3大门欲关又止&&美国非农就业数据再度引发市场对美联储是否推出QE3的讨论,也给了投资者一个警告:或许美国经济改善的程度并没有大家预期中那么乐观,而宽松政策退出也言之尚早。&&法国巴黎银行驻纽约高级外汇策略师阿特里尔表示,尽管就业数据并没有给伯南克马上宣布QE3打开绿灯,但毫无疑问,一些美联储官员认为需要实施进一步宽松措施的条件正在出现。&&太平洋投资管理公司(PIMCO)策略师托尼表示,强劲的就业人数增长势头未能持续下去,这说明美国经济依然充满不确定性。也就是说,如果缺少美联储额外宽松货币政策加以支持,美国经济复苏势头将难以为继。&&不过,穆迪旗下的首席经济学家赞迪认为,单靠3月份的糟糕数据并不能得出美联储实施QE3可能性变得更大的结论。美联储货币政策重要智囊、摩根士丹利首席美国经济学家哈特指出,该行已将QE3推出的概率由2/3降至1/3。&&伯南克如何应对&&新增就业岗位数量不及预期,也印证了伯南克对就业市场发表谨慎看法是有道理的。日前,伯南克对近期就业增长态势能否保持下去表达了怀疑。伯南克表示,尽管美国就业市场已有所改善,但远未恢复正常。若要产生足够的就业岗位,并令失业率进一步下降,美国经济需要以更快的速度增长。假以时日,宽松政策应能提供帮助。&&本周,伯南克将在亚特兰大联邦储备银行主办的2012年金融市场会议上发表讲话,众多的美联储官员随后也将陆续发表讲话,投资者可以从他们的言辞中寻找QE3会否推出的线索。&&不过,有分析人士表示,美联储内部分歧严重,投资者担心又会被伯南克的嘴皮子功夫“忽悠”了。
本版导读:}

我要回帖

更多关于 不妙 复仇.黑暗网站 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信