case句子的用法ITeye - 千亿集团

case句子的用法ITeye

2019-01-10 11:14:11 | 作者: 鸿德 | 标签: 句子,函数,用法 | 浏览: 1570

CASE WHEN 及 SELECT CASE WHEN的用法
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)
CASE wbr WHEN wbr 及 wbr SELECT wbr CASE wbr WHEN的用法
依据这个国家人口数据,计算亚洲和北美洲的人口数量。应该得到下面这个成果。
CASE wbr WHEN wbr 及 wbr SELECT wbr CASE wbr WHEN的用法
  处理这个问题,你会怎么做?生成一个带有洲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句子完结不同条件的分组。

有如下数据
CASE wbr WHEN wbr 及 wbr SELECT wbr CASE wbr WHEN的用法

依照国家和性别进行分组,得出成果如下
CASE wbr WHEN wbr 及 wbr SELECT wbr CASE wbr WHEN的用法
  一般状况下,用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来体现的话,如下所示
THEN 1 ELSE 0 END  ELSE 1 END = 1 )
假如单纯运用Check: CONSTRAINT check_salary CHECK  ( sex = 2 AND salary 1000 )  女职工的条件却是契合了,男职工就无法输入了。
四,依据条件有挑选的UPDATE。

例,有如下更新条件
1.薪酬5000以上的职工,薪酬削减10%
2.薪酬在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的话,就没有下面的费事事了,为了举比如,还请多多包括)。
现在咱们要依照下面两个条件对这个表进行查询
1.只选修一门课程的人,回来那门课程的ID

2.选修多门课程的人,回来所选的主课程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。



七、小结

  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 1
  ELSE NULL
  END) 女生数
FROM students

GROUP BY grade;


转https://www.cnblogs.com/aipan/p/7770611.html
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表千亿集团立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    exceptionITeye

    成果,形似,有点
  • 2
  • 3

    mysql的count函数优化ITeye

    索引,优化,情况
  • 4
  • 5

    DB2锁机制ITeye

    机制,程序,数据
  • 6

    oracle功能优化总结ITeye

    索引,视图,优化
  • 7

    oracle存储进程ITeye

    存储,进程,数据
  • 8

    Oracle中rownum、rowid、rowITeye

    相同,记载,排名
  • 9
  • 10