考古学end用法举例

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 

基于这一个国家人口数量,统计澳大利亚联邦(Commonwealth of Australia)和澳大利亚的人口数量。应该取得上面这些结果。 
洲 人口 
亚洲 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 ) 

女人员的规范倒是符合了,男人士就不可以输入了

 

四,按照标准有取舍的UPDATE。 

例,有如下更新标准 
工薪5000上述的老干部,薪水收缩10% 
工薪在2000到4600中间的老干部,薪水增添15% 
很简单考虑的是选取执行两遍UPDATE语句,如下所示 

–条件1 
UPDATE Personnel 
SET salary = salary * 0.9 
WHERE salary >= 5000; 
–条件2 
UPDATE Personnel 
SET salary = salary * 1.15 
WHERE salary >= 2000 AND salary < 4600; 

然则工作没有设想得那么粗略,假诺有个体薪给5000块。首先,依照标准1,薪酬收缩10%,变成薪酬4500。接下来运行第四个SQL时候,因为此人的工薪是4500在2000到4600的界定之内,
需扩张15%,最后此人的薪酬结果是5175,不但没有减掉,反而有增无减了。假若假定扭动执行,那么薪水4600的人相反会变成裁减报酬。暂且不论那么些条例是何等荒诞,如若想要一个SQL
语句达成那么些效果的话,大家须要用到Case函数。代码如下: 

UPDATE Personnel 
SET salary = CASE WHEN salary >= 5000 
             THEN salary * 0.9 
WHEN salary >= 2000 AND salary < 4600 
THEN salary * 1.15 
ELSE salary END; 

那边要小心一点,最终一行的ELSE
salary是不可或缺的,假诺没有那行,不相符那多个条件的人的报酬将会被写成NUll,那可就大事不妙了。在Case函数中Else部分的默许值是NULL,那一点是亟需小心的地点。 
那种办法仍能在众多地点选择,比如说变更主键那种累活。 
一般景色下,要想把两条数据的Primary
key,a和b交流,须求通过临时存储,拷贝,读回数据的多少个进度,若是使用Case函数的话,一切都变得简单多了。 
p_key col_1 col_2 
a 1 张三 
b 2 李四 
c 3 王五 

只要有如上多少,必要把主键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 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; 

执行结果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) 
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 
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:

应用该查询,得出iFavoriteID,iFavUserType
,cUser,iArticleID,dFavorite提姆e三个字段的值:

SELECT iFavoriteID,
CASE WHEN iFavUserType = 0 THEN ‘新闻管理员’
WHEN iFavUserType = 1 THEN ‘商家’
WHEN iFavUserType = 2 THEN ‘会员’
WHEN iFavUserType = 3 THEN ‘未注册’
WHEN iFavUserType = 4 then ‘匿名’
END AS iFavUserType, cUser, iArticleID,
CONVERT(nvarchar(100), dFavoriteTime, 111) AS dFavoriteTime FROM
dig_favorite

举例2:

SELECT CASE WHEN `MEMBERTYPE` =1
THEN ‘参赛队员’
ELSE ‘引导老师’
END FROM `tab_sign_member`
WHERE 1

 

 


下边为你举例表达了两种mysql中case
when语句的选取办法,供您参考学习,若是你对mysql中case
when语句使用方面感兴趣的话,不妨一看。

1。

  1. select name,  
  2.  case   
  3.         when birthday<‘1981’ then ‘old’
     
  4.         when birthday>’1988′ then ‘yong’
     
  5.         else ‘ok’ END YORN  
  6. from lee; 

2。

  1. select NAME,  
  2.  case name  
  3.      when ‘sam’ then ‘yong’  
  4.         when ‘lee’ then ‘handsome’  
  5.         else ‘good’ end  
  6. from lee; 

自然了case when语句还足以复合

3。

  1. select name,birthday,  
  2.  case   
  3.      when birthday>’1983′ then ‘yong’  
  4.         when name=’lee’ then ‘handsome’  
  5.         else ‘just so so ‘ end  
  6. from lee;  
  7.  

以上就是mysql中case when语句的使用示例的介绍。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图