case用法


来自:http://topic.csdn.net/u/20090304/15/e827ea69-3d56-4557-abae-d5701ee24330.html

 

 

 

SQL code
  
  
SQL中Case的使用方法(上篇) Case具有两种格式。简单Case函数和Case搜索函数。 -- 简单Case函数 CASE sex 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 ) 国家(country) 人口(population) 中国 600 美国 100 加拿大 100 英国 200 法国 300 日本 250 德国 200 墨西哥 50 印度 250 根据这个国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。 洲 人口 亚洲 1100 北美洲 250 其他 700 想要解决这个问题,你会怎么做?生成一个带有洲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 GROUP BY CASE country WHEN ' 中国 ' THEN ' 亚洲 ' WHEN ' 印度 ' THEN ' 亚洲 ' WHEN ' 日本 ' THEN ' 亚洲 ' WHEN ' 美国 ' THEN ' 北美洲 ' WHEN ' 加拿大 ' THEN ' 北美洲 ' WHEN ' 墨西哥 ' THEN ' 北美洲 ' ELSE ' 其他 ' END ; 同样的,我们也可以用这个方法来判断工资的等级,并统计每一等级的人数。SQL代码如下; 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 ; 二,用一个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 > 1000 THEN 1 ELSE 0 END ELSE 1 END = 1 ) 如果单纯使用Check,如下所示 CONSTRAINT check_salary CHECK ( sex = ' 2 ' AND salary > 1000 ) 女职员的条件倒是符合了,男职员就无法输入了。 六,在Case函数中使用sum函数 假X有下面一个表 学号 课程ID(class_id) 课程名(class_name) 主修(main_class_fl) 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 )。选修多门课程的学生,要选择一门课程作为主修,主修fl里面写入 Y。只选择一门课程的学生,主修fl为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 ; 执行结果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_fl = ' Y ' ; 执行结果2 STD_ID MAIN_class -- ---- ---------- 100 1 200 3 如果使用Case函数,我们只要一条SQL语句就可以解决问题,具体如下所示 SELECT std_id, CASE WHEN COUNT ( * ) = 1 -- 只选择一门课程的学生的情况 THEN MAX (class_id) ELSE MAX ( CASE WHEN main_class_fl = ' 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 300 4 400 5 500 6 通过在Case函数中嵌套Case函数,在合计函数中使用Case函数等方法,我们可以轻松的解决这个问题。使用Case函数给我们带来了更大的自由度。 最后提醒一下使用Case函数的新手注意不要犯下面的错误 CASE col_1 WHEN 1   THEN ' Right ' WHEN NULL THEN ' Wrong ' END 在这个语句中When Null这一行总是返回unknown,所以永远不会出现Wrong的情况。因为这句可以替换成WHEN col_1 = NULL ,这是一个错误的用法,这个时候我们应该选择用WHEN col_1 IS NULL 。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值