首页 > 数据库 > Oracle > ORACLE CASE函数
Case具有两种格局。简单Case函数战Case搜刮函数。
--简单Case函数
WHEN "1" THEN "男"
WHEN "2" THEN "女"
ELSE "其他" END
--Case搜刮函数
WHEN *** = "2" THEN "女"
ELSE "其他" END
这两种体式格局,可以或许真现相同的功用。简单Case函数的写法相比较力简洁,可是战Case搜刮函数相比,功用方面会有些限制,好比写判断式。
还有一个需要留心的标题问题,Case函数只返回第一个吻合前提的值,剩下的Case部分将会被自动无视。
好比讲,下面这段SQL,您永近没法获得“第两类”这个成便
CASE WHEN col_1 IN ( "a", "b") THEN
"第一类"
WHEN col_1 IN
("a")
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
"中国"
WHEN
"印度"
WHEN
"日本"
WHEN
"美国"
WHEN "减拿大" THEN "北美洲"
WHEN "朱西哥" THEN "北美洲"
ELSE "其他" END
FROM
GROUP BY CASE country
WHEN
"中国"
WHEN
"印度"
WHEN
"日本"
WHEN
"美国"
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
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) 性别(***) 人口(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 *** = "1" THEN
population ELSE 0 END), --男性人口
SUM( CASE WHEN *** = "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 *** = "2"
THEN CASE WHEN salary >
1000
THEN 1 ELSE 0 END
ELSE
假设纯正使用Check,如下所示
CONSTRAINT check_salary CHECK
( *** = "2" AND salary > 1000
)
女职员的前提倒是吻合了,男职员便没法输进了。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23554140/viewspace-1116194/ ,如需转载,请注明出处,否则将追究法律责任。